Setting up the R workspace

library(tidyverse)
── Attaching core tidyverse packages ─────────────────────────────────────────────────────────────────────── tidyverse 2.0.0 ──
✔ forcats 1.0.0     ✔ stringr 1.5.1
✔ purrr   1.0.2     ✔ tibble  3.2.1
✔ readr   2.1.5     ✔ tidyr   1.3.1
── Conflicts ───────────────────────────────────────────────────────────────────────────────────────── tidyverse_conflicts() ──
✖ dplyr::filter() masks stats::filter()
✖ dplyr::lag()    masks stats::lag()
ℹ Use the ]8;;http://conflicted.r-lib.org/conflicted package]8;; to force all conflicts to become errors
library(rjags)
Loading required package: coda
Linked to JAGS 4.3.2
Loaded modules: basemod,bugs
library(ggplot2)
library(hydroGOF)

set.seed(1)

Starting with the Copper River Delta (CRD)

RCP 4.5

Design the Model

Read in the data here, which is an output of XX code file

Then separate the data into air and water temperature files

# Air and water temperature data: CR loccation, 4.5 scenario
CR_Temps <- read.csv("CR_45SNAPForecast.csv", header=TRUE)

# Air temperature variables
CR_AirTemp45 <- CR_Temps %>%
  select(date, Airport, Air_MonthAvg, std, precision, Region)

# Water temperature variables
CR_WaterTemp45 <- CR_Temps %>%
  select(date, BVS, CAB, TIN, SQR, CAN, EYS, TIS, WDD, RHM)


# Set up a string of all the dates
time <- CR_WaterTemp45$date
length(time)
[1] 1164

Setting up the random walk model

dlm_pooled <- "
model{
#### Priors
for(p in 1:np){
x[1,p] ~ dnorm(x_ic, tau_ic) # Initial condition of water temperature
}
tau_obs ~ dgamma(a_obs, r_obs) # Prior on observation error
tau_add ~ dgamma(a_add, r_add) # Prior on process error

#### Fixed Effects
beta ~ dmnorm(mu_beta, tau_beta) # Prior on beta coefficients

for(p in 1:np){
int[p] ~ dnorm(mu_int, tau_int) # Prior on pond-specific intercepts
}

#### Data Model
for(t in 1:n){ # loop over all time steps
for(p in 1:np){
OBS[t,p] ~ dnorm(x[t,p], tau_obs) # Observed water temperature is drawn from latent air temperature with observation uncertainty
}
Xf[t] ~ dnorm(muAirTemp[t], tauAirTemp[t]) # Latent air temperature is drawn from mean and precision of forecasated air temperature
}

#### Process Model
for(t in 2:n){ # loop over all time steps except teh first (we defined ic above)
for(p in 1:np){
mu[t,p] <- x[t-1,p] + int[p] + beta[1] * x[t-1,p] + beta[2] * Xf[t] # Mean water temperature is a function of the previous time step and current air temperature
x[t,p] ~ dnorm(mu[t,p], tau_add) # Latent water temperature is drawn from mean water temperature with process uncertainty
}
}
}
"

Define the data and priors for the model

# Empty list
data <- list()
# Water temperature observations
data$OBS <- dplyr::select(CR_WaterTemp45, -date)
# Number of time steps
data$n <- nrow(data$OBS)
# Number of ponds
data$np <- ncol(data$OBS)
# Initial water temperature mean
data$x_ic <- 0.1
# Initial water temperature precision
data$tau_ic = 0.1
# Prior parameters for observation and process uncertainty
data$a_obs = 1
data$r_obs = 1
data$a_add = 1
data$r_add = 1
# Prior parameters for beta coefficients
data$mu_beta <- c(0, 0)
data$tau_beta <- diag(x = c(0.001, 0.001), nrow = 2, ncol = 2)
# Prior parameters for intercept
data$mu_int <- 0
data$tau_int <- 0.001
# Mean air temperature estimate
data$muAirTemp <- CR_AirTemp45$Air_MonthAvg
# Air temperature precision
data$tauAirTemp <- CR_AirTemp45$precision

Create JAGS model with 3 chains

jm <- jags.model(file = textConnection(dlm_pooled), data = data, n.chains = 3)
Compiling model graph
   Resolving undeclared variables
   Allocating nodes
Graph information:
   Observed stochastic nodes: 448
   Unobserved stochastic nodes: 21680
   Total graph size: 46573

Initializing model

Posterior samples of parameters

CRD45_out_params <- coda.samples(model = jm,
                               variable.names = c('beta', 'int',
                                                  'tau_add', 'tau_obs'),
                               n.iter = 50000, thin = 25)

  |                                                        
  |                                                  |   0%
  |                                                        
  |*                                                 |   2%
  |                                                        
  |**                                                |   4%
  |                                                        
  |***                                               |   6%
  |                                                        
  |****                                              |   8%
  |                                                        
  |*****                                             |  10%
  |                                                        
  |******                                            |  12%
  |                                                        
  |*******                                           |  14%
  |                                                        
  |********                                          |  16%
  |                                                        
  |*********                                         |  18%
  |                                                        
  |**********                                        |  20%
  |                                                        
  |***********                                       |  22%
  |                                                        
  |************                                      |  24%
  |                                                        
  |*************                                     |  26%
  |                                                        
  |**************                                    |  28%
  |                                                        
  |***************                                   |  30%
  |                                                        
  |****************                                  |  32%
  |                                                        
  |*****************                                 |  34%
  |                                                        
  |******************                                |  36%
  |                                                        
  |*******************                               |  38%
  |                                                        
  |********************                              |  40%
  |                                                        
  |*********************                             |  42%
  |                                                        
  |**********************                            |  44%
  |                                                        
  |***********************                           |  46%
  |                                                        
  |************************                          |  48%
  |                                                        
  |*************************                         |  50%
  |                                                        
  |**************************                        |  52%
  |                                                        
  |***************************                       |  54%
  |                                                        
  |****************************                      |  56%
  |                                                        
  |*****************************                     |  58%
  |                                                        
  |******************************                    |  60%
  |                                                        
  |*******************************                   |  62%
  |                                                        
  |********************************                  |  64%
  |                                                        
  |*********************************                 |  66%
  |                                                        
  |**********************************                |  68%
  |                                                        
  |***********************************               |  70%
  |                                                        
  |************************************              |  72%
  |                                                        
  |*************************************             |  74%
  |                                                        
  |**************************************            |  76%
  |                                                        
  |***************************************           |  78%
  |                                                        
  |****************************************          |  80%
  |                                                        
  |*****************************************         |  82%
  |                                                        
  |******************************************        |  84%
  |                                                        
  |*******************************************       |  86%
  |                                                        
  |********************************************      |  88%
  |                                                        
  |*********************************************     |  90%
  |                                                        
  |**********************************************    |  92%
  |                                                        
  |***********************************************   |  94%
  |                                                        
  |************************************************  |  96%
  |                                                        
  |************************************************* |  98%
  |                                                        
  |**************************************************| 100%

Posterior samples of response variables

CRD45_out_response <- coda.samples(model = jm,
                                 variable.names = c('x', 'OBS'),
                                 n.iter = 100000, thin = 25)

  |                                                        
  |                                                  |   0%
  |                                                        
  |*                                                 |   2%
  |                                                        
  |**                                                |   4%
  |                                                        
  |***                                               |   6%
  |                                                        
  |****                                              |   8%
  |                                                        
  |*****                                             |  10%
  |                                                        
  |******                                            |  12%
  |                                                        
  |*******                                           |  14%
  |                                                        
  |********                                          |  16%
  |                                                        
  |*********                                         |  18%
  |                                                        
  |**********                                        |  20%
  |                                                        
  |***********                                       |  22%
  |                                                        
  |************                                      |  24%
  |                                                        
  |*************                                     |  26%
  |                                                        
  |**************                                    |  28%
  |                                                        
  |***************                                   |  30%
  |                                                        
  |****************                                  |  32%
  |                                                        
  |*****************                                 |  34%
  |                                                        
  |******************                                |  36%
  |                                                        
  |*******************                               |  38%
  |                                                        
  |********************                              |  40%
  |                                                        
  |*********************                             |  42%
  |                                                        
  |**********************                            |  44%
  |                                                        
  |***********************                           |  46%
  |                                                        
  |************************                          |  48%
  |                                                        
  |*************************                         |  50%
  |                                                        
  |**************************                        |  52%
  |                                                        
  |***************************                       |  54%
  |                                                        
  |****************************                      |  56%
  |                                                        
  |*****************************                     |  58%
  |                                                        
  |******************************                    |  60%
  |                                                        
  |*******************************                   |  62%
  |                                                        
  |********************************                  |  64%
  |                                                        
  |*********************************                 |  66%
  |                                                        
  |**********************************                |  68%
  |                                                        
  |***********************************               |  70%
  |                                                        
  |************************************              |  72%
  |                                                        
  |*************************************             |  74%
  |                                                        
  |**************************************            |  76%
  |                                                        
  |***************************************           |  78%
  |                                                        
  |****************************************          |  80%
  |                                                        
  |*****************************************         |  82%
  |                                                        
  |******************************************        |  84%
  |                                                        
  |*******************************************       |  86%
  |                                                        
  |********************************************      |  88%
  |                                                        
  |*********************************************     |  90%
  |                                                        
  |**********************************************    |  92%
  |                                                        
  |***********************************************   |  94%
  |                                                        
  |************************************************  |  96%
  |                                                        
  |************************************************* |  98%
  |                                                        
  |**************************************************| 100%

A couple quick checks here

# plot(CRD45_out_params)
gelman.diag(CRD45_out_params, confidence = 0.99)
Potential scale reduction factors:

        Point est. Upper C.I.
beta[1]       1.00       1.01
beta[2]       1.01       1.04
int[1]        1.01       1.03
int[2]        1.01       1.04
int[3]        1.01       1.02
int[4]        1.00       1.02
int[5]        1.01       1.04
int[6]        1.01       1.04
int[7]        1.01       1.04
int[8]        1.01       1.04
int[9]        1.01       1.04
tau_add       1.00       1.00
tau_obs       1.00       1.00

Multivariate psrf

1.01

Visualize the output by just looking at the 95% credible interval of the time-series of X’s and compare that to the observed Y’s

Transform the samples back from the log domain to the linear domain

time                               ## adjust to zoom in and out
   [1] "2012-01-01" "2012-02-01" "2012-03-01" "2012-04-01" "2012-05-01" "2012-06-01" "2012-07-01"
   [8] "2012-08-01" "2012-09-01" "2012-10-01" "2012-11-01" "2012-12-01" "2013-01-01" "2013-02-01"
  [15] "2013-03-01" "2013-04-01" "2013-05-01" "2013-06-01" "2013-07-01" "2013-08-01" "2013-09-01"
  [22] "2013-10-01" "2013-11-01" "2013-12-01" "2014-01-01" "2014-02-01" "2014-03-01" "2014-04-01"
  [29] "2014-05-01" "2014-06-01" "2014-07-01" "2014-08-01" "2014-09-01" "2014-10-01" "2014-11-01"
  [36] "2014-12-01" "2015-01-01" "2015-02-01" "2015-03-01" "2015-04-01" "2015-05-01" "2015-06-01"
  [43] "2015-07-01" "2015-08-01" "2015-09-01" "2015-10-01" "2015-11-01" "2015-12-01" "2016-01-01"
  [50] "2016-02-01" "2016-03-01" "2016-04-01" "2016-05-01" "2016-06-01" "2016-07-01" "2016-08-01"
  [57] "2016-09-01" "2016-10-01" "2016-11-01" "2016-12-01" "2017-01-01" "2017-02-01" "2017-03-01"
  [64] "2017-04-01" "2017-05-01" "2017-06-01" "2017-07-01" "2017-08-01" "2017-09-01" "2017-10-01"
  [71] "2017-11-01" "2017-12-01" "2018-01-01" "2018-02-01" "2018-03-01" "2018-04-01" "2018-05-01"
  [78] "2018-06-01" "2018-07-01" "2018-08-01" "2018-09-01" "2018-10-01" "2018-11-01" "2018-12-01"
  [85] "2019-01-01" "2019-02-01" "2019-03-01" "2019-04-01" "2019-05-01" "2019-06-01" "2019-07-01"
  [92] "2019-08-01" "2019-09-01" "2019-10-01" "2019-11-01" "2019-12-01" "2012-01-01" "2012-02-01"
  [99] "2012-03-01" "2012-04-01" "2012-05-01" "2012-06-01" "2012-07-01" "2012-08-01" "2012-09-01"
 [106] "2012-10-01" "2012-11-01" "2012-12-01" "2013-01-01" "2013-02-01" "2013-03-01" "2013-04-01"
 [113] "2013-05-01" "2013-06-01" "2013-07-01" "2013-08-01" "2013-09-01" "2013-10-01" "2013-11-01"
 [120] "2013-12-01" "2014-01-01" "2014-02-01" "2014-03-01" "2014-04-01" "2014-05-01" "2014-06-01"
 [127] "2014-07-01" "2014-08-01" "2014-09-01" "2014-10-01" "2014-11-01" "2014-12-01" "2015-01-01"
 [134] "2015-02-01" "2015-03-01" "2015-04-01" "2015-05-01" "2015-06-01" "2015-07-01" "2015-08-01"
 [141] "2015-09-01" "2015-10-01" "2015-11-01" "2015-12-01" "2016-01-01" "2016-02-01" "2016-03-01"
 [148] "2016-04-01" "2016-05-01" "2016-06-01" "2016-07-01" "2016-08-01" "2016-09-01" "2016-10-01"
 [155] "2016-11-01" "2016-12-01" "2017-01-01" "2017-02-01" "2017-03-01" "2017-04-01" "2017-05-01"
 [162] "2017-06-01" "2017-07-01" "2017-08-01" "2017-09-01" "2017-10-01" "2017-11-01" "2017-12-01"
 [169] "2018-01-01" "2018-02-01" "2018-03-01" "2018-04-01" "2018-05-01" "2018-06-01" "2018-07-01"
 [176] "2018-08-01" "2018-09-01" "2018-10-01" "2018-11-01" "2018-12-01" "2019-01-01" "2019-02-01"
 [183] "2019-03-01" "2019-04-01" "2019-05-01" "2019-06-01" "2019-07-01" "2019-08-01" "2019-09-01"
 [190] "2019-10-01" "2019-11-01" "2019-12-01" "2020-01-01" "2020-02-01" "2020-03-01" "2020-04-01"
 [197] "2020-05-01" "2020-06-01" "2020-07-01" "2020-08-01" "2020-09-01" "2020-10-01" "2020-11-01"
 [204] "2020-12-01" "2021-01-01" "2021-02-01" "2021-03-01" "2021-04-01" "2021-05-01" "2021-06-01"
 [211] "2021-07-01" "2021-08-01" "2021-09-01" "2021-10-01" "2021-11-01" "2021-12-01" "2022-01-01"
 [218] "2022-02-01" "2022-03-01" "2022-04-01" "2022-05-01" "2022-06-01" "2022-07-01" "2022-08-01"
 [225] "2022-09-01" "2022-10-01" "2022-11-01" "2022-12-01" "2023-01-01" "2023-02-01" "2023-03-01"
 [232] "2023-04-01" "2023-05-01" "2023-06-01" "2023-07-01" "2023-08-01" "2023-09-01" "2023-10-01"
 [239] "2023-11-01" "2023-12-01" "2024-01-01" "2024-02-01" "2024-03-01" "2024-04-01" "2024-05-01"
 [246] "2024-06-01" "2024-07-01" "2024-08-01" "2024-09-01" "2024-10-01" "2024-11-01" "2024-12-01"
 [253] "2025-01-01" "2025-02-01" "2025-03-01" "2025-04-01" "2025-05-01" "2025-06-01" "2025-07-01"
 [260] "2025-08-01" "2025-09-01" "2025-10-01" "2025-11-01" "2025-12-01" "2026-01-01" "2026-02-01"
 [267] "2026-03-01" "2026-04-01" "2026-05-01" "2026-06-01" "2026-07-01" "2026-08-01" "2026-09-01"
 [274] "2026-10-01" "2026-11-01" "2026-12-01" "2027-01-01" "2027-02-01" "2027-03-01" "2027-04-01"
 [281] "2027-05-01" "2027-06-01" "2027-07-01" "2027-08-01" "2027-09-01" "2027-10-01" "2027-11-01"
 [288] "2027-12-01" "2028-01-01" "2028-02-01" "2028-03-01" "2028-04-01" "2028-05-01" "2028-06-01"
 [295] "2028-07-01" "2028-08-01" "2028-09-01" "2028-10-01" "2028-11-01" "2028-12-01" "2029-01-01"
 [302] "2029-02-01" "2029-03-01" "2029-04-01" "2029-05-01" "2029-06-01" "2029-07-01" "2029-08-01"
 [309] "2029-09-01" "2029-10-01" "2029-11-01" "2029-12-01" "2030-01-01" "2030-02-01" "2030-03-01"
 [316] "2030-04-01" "2030-05-01" "2030-06-01" "2030-07-01" "2030-08-01" "2030-09-01" "2030-10-01"
 [323] "2030-11-01" "2030-12-01" "2031-01-01" "2031-02-01" "2031-03-01" "2031-04-01" "2031-05-01"
 [330] "2031-06-01" "2031-07-01" "2031-08-01" "2031-09-01" "2031-10-01" "2031-11-01" "2031-12-01"
 [337] "2032-01-01" "2032-02-01" "2032-03-01" "2032-04-01" "2032-05-01" "2032-06-01" "2032-07-01"
 [344] "2032-08-01" "2032-09-01" "2032-10-01" "2032-11-01" "2032-12-01" "2033-01-01" "2033-02-01"
 [351] "2033-03-01" "2033-04-01" "2033-05-01" "2033-06-01" "2033-07-01" "2033-08-01" "2033-09-01"
 [358] "2033-10-01" "2033-11-01" "2033-12-01" "2034-01-01" "2034-02-01" "2034-03-01" "2034-04-01"
 [365] "2034-05-01" "2034-06-01" "2034-07-01" "2034-08-01" "2034-09-01" "2034-10-01" "2034-11-01"
 [372] "2034-12-01" "2035-01-01" "2035-02-01" "2035-03-01" "2035-04-01" "2035-05-01" "2035-06-01"
 [379] "2035-07-01" "2035-08-01" "2035-09-01" "2035-10-01" "2035-11-01" "2035-12-01" "2036-01-01"
 [386] "2036-02-01" "2036-03-01" "2036-04-01" "2036-05-01" "2036-06-01" "2036-07-01" "2036-08-01"
 [393] "2036-09-01" "2036-10-01" "2036-11-01" "2036-12-01" "2037-01-01" "2037-02-01" "2037-03-01"
 [400] "2037-04-01" "2037-05-01" "2037-06-01" "2037-07-01" "2037-08-01" "2037-09-01" "2037-10-01"
 [407] "2037-11-01" "2037-12-01" "2038-01-01" "2038-02-01" "2038-03-01" "2038-04-01" "2038-05-01"
 [414] "2038-06-01" "2038-07-01" "2038-08-01" "2038-09-01" "2038-10-01" "2038-11-01" "2038-12-01"
 [421] "2039-01-01" "2039-02-01" "2039-03-01" "2039-04-01" "2039-05-01" "2039-06-01" "2039-07-01"
 [428] "2039-08-01" "2039-09-01" "2039-10-01" "2039-11-01" "2039-12-01" "2040-01-01" "2040-02-01"
 [435] "2040-03-01" "2040-04-01" "2040-05-01" "2040-06-01" "2040-07-01" "2040-08-01" "2040-09-01"
 [442] "2040-10-01" "2040-11-01" "2040-12-01" "2041-01-01" "2041-02-01" "2041-03-01" "2041-04-01"
 [449] "2041-05-01" "2041-06-01" "2041-07-01" "2041-08-01" "2041-09-01" "2041-10-01" "2041-11-01"
 [456] "2041-12-01" "2042-01-01" "2042-02-01" "2042-03-01" "2042-04-01" "2042-05-01" "2042-06-01"
 [463] "2042-07-01" "2042-08-01" "2042-09-01" "2042-10-01" "2042-11-01" "2042-12-01" "2043-01-01"
 [470] "2043-02-01" "2043-03-01" "2043-04-01" "2043-05-01" "2043-06-01" "2043-07-01" "2043-08-01"
 [477] "2043-09-01" "2043-10-01" "2043-11-01" "2043-12-01" "2044-01-01" "2044-02-01" "2044-03-01"
 [484] "2044-04-01" "2044-05-01" "2044-06-01" "2044-07-01" "2044-08-01" "2044-09-01" "2044-10-01"
 [491] "2044-11-01" "2044-12-01" "2045-01-01" "2045-02-01" "2045-03-01" "2045-04-01" "2045-05-01"
 [498] "2045-06-01" "2045-07-01" "2045-08-01" "2045-09-01" "2045-10-01" "2045-11-01" "2045-12-01"
 [505] "2046-01-01" "2046-02-01" "2046-03-01" "2046-04-01" "2046-05-01" "2046-06-01" "2046-07-01"
 [512] "2046-08-01" "2046-09-01" "2046-10-01" "2046-11-01" "2046-12-01" "2047-01-01" "2047-02-01"
 [519] "2047-03-01" "2047-04-01" "2047-05-01" "2047-06-01" "2047-07-01" "2047-08-01" "2047-09-01"
 [526] "2047-10-01" "2047-11-01" "2047-12-01" "2048-01-01" "2048-02-01" "2048-03-01" "2048-04-01"
 [533] "2048-05-01" "2048-06-01" "2048-07-01" "2048-08-01" "2048-09-01" "2048-10-01" "2048-11-01"
 [540] "2048-12-01" "2049-01-01" "2049-02-01" "2049-03-01" "2049-04-01" "2049-05-01" "2049-06-01"
 [547] "2049-07-01" "2049-08-01" "2049-09-01" "2049-10-01" "2049-11-01" "2049-12-01" "2050-01-01"
 [554] "2050-02-01" "2050-03-01" "2050-04-01" "2050-05-01" "2050-06-01" "2050-07-01" "2050-08-01"
 [561] "2050-09-01" "2050-10-01" "2050-11-01" "2050-12-01" "2051-01-01" "2051-02-01" "2051-03-01"
 [568] "2051-04-01" "2051-05-01" "2051-06-01" "2051-07-01" "2051-08-01" "2051-09-01" "2051-10-01"
 [575] "2051-11-01" "2051-12-01" "2052-01-01" "2052-02-01" "2052-03-01" "2052-04-01" "2052-05-01"
 [582] "2052-06-01" "2052-07-01" "2052-08-01" "2052-09-01" "2052-10-01" "2052-11-01" "2052-12-01"
 [589] "2053-01-01" "2053-02-01" "2053-03-01" "2053-04-01" "2053-05-01" "2053-06-01" "2053-07-01"
 [596] "2053-08-01" "2053-09-01" "2053-10-01" "2053-11-01" "2053-12-01" "2054-01-01" "2054-02-01"
 [603] "2054-03-01" "2054-04-01" "2054-05-01" "2054-06-01" "2054-07-01" "2054-08-01" "2054-09-01"
 [610] "2054-10-01" "2054-11-01" "2054-12-01" "2055-01-01" "2055-02-01" "2055-03-01" "2055-04-01"
 [617] "2055-05-01" "2055-06-01" "2055-07-01" "2055-08-01" "2055-09-01" "2055-10-01" "2055-11-01"
 [624] "2055-12-01" "2056-01-01" "2056-02-01" "2056-03-01" "2056-04-01" "2056-05-01" "2056-06-01"
 [631] "2056-07-01" "2056-08-01" "2056-09-01" "2056-10-01" "2056-11-01" "2056-12-01" "2057-01-01"
 [638] "2057-02-01" "2057-03-01" "2057-04-01" "2057-05-01" "2057-06-01" "2057-07-01" "2057-08-01"
 [645] "2057-09-01" "2057-10-01" "2057-11-01" "2057-12-01" "2058-01-01" "2058-02-01" "2058-03-01"
 [652] "2058-04-01" "2058-05-01" "2058-06-01" "2058-07-01" "2058-08-01" "2058-09-01" "2058-10-01"
 [659] "2058-11-01" "2058-12-01" "2059-01-01" "2059-02-01" "2059-03-01" "2059-04-01" "2059-05-01"
 [666] "2059-06-01" "2059-07-01" "2059-08-01" "2059-09-01" "2059-10-01" "2059-11-01" "2059-12-01"
 [673] "2060-01-01" "2060-02-01" "2060-03-01" "2060-04-01" "2060-05-01" "2060-06-01" "2060-07-01"
 [680] "2060-08-01" "2060-09-01" "2060-10-01" "2060-11-01" "2060-12-01" "2061-01-01" "2061-02-01"
 [687] "2061-03-01" "2061-04-01" "2061-05-01" "2061-06-01" "2061-07-01" "2061-08-01" "2061-09-01"
 [694] "2061-10-01" "2061-11-01" "2061-12-01" "2062-01-01" "2062-02-01" "2062-03-01" "2062-04-01"
 [701] "2062-05-01" "2062-06-01" "2062-07-01" "2062-08-01" "2062-09-01" "2062-10-01" "2062-11-01"
 [708] "2062-12-01" "2063-01-01" "2063-02-01" "2063-03-01" "2063-04-01" "2063-05-01" "2063-06-01"
 [715] "2063-07-01" "2063-08-01" "2063-09-01" "2063-10-01" "2063-11-01" "2063-12-01" "2064-01-01"
 [722] "2064-02-01" "2064-03-01" "2064-04-01" "2064-05-01" "2064-06-01" "2064-07-01" "2064-08-01"
 [729] "2064-09-01" "2064-10-01" "2064-11-01" "2064-12-01" "2065-01-01" "2065-02-01" "2065-03-01"
 [736] "2065-04-01" "2065-05-01" "2065-06-01" "2065-07-01" "2065-08-01" "2065-09-01" "2065-10-01"
 [743] "2065-11-01" "2065-12-01" "2066-01-01" "2066-02-01" "2066-03-01" "2066-04-01" "2066-05-01"
 [750] "2066-06-01" "2066-07-01" "2066-08-01" "2066-09-01" "2066-10-01" "2066-11-01" "2066-12-01"
 [757] "2067-01-01" "2067-02-01" "2067-03-01" "2067-04-01" "2067-05-01" "2067-06-01" "2067-07-01"
 [764] "2067-08-01" "2067-09-01" "2067-10-01" "2067-11-01" "2067-12-01" "2068-01-01" "2068-02-01"
 [771] "2068-03-01" "2068-04-01" "2068-05-01" "2068-06-01" "2068-07-01" "2068-08-01" "2068-09-01"
 [778] "2068-10-01" "2068-11-01" "2068-12-01" "2069-01-01" "2069-02-01" "2069-03-01" "2069-04-01"
 [785] "2069-05-01" "2069-06-01" "2069-07-01" "2069-08-01" "2069-09-01" "2069-10-01" "2069-11-01"
 [792] "2069-12-01" "2070-01-01" "2070-02-01" "2070-03-01" "2070-04-01" "2070-05-01" "2070-06-01"
 [799] "2070-07-01" "2070-08-01" "2070-09-01" "2070-10-01" "2070-11-01" "2070-12-01" "2071-01-01"
 [806] "2071-02-01" "2071-03-01" "2071-04-01" "2071-05-01" "2071-06-01" "2071-07-01" "2071-08-01"
 [813] "2071-09-01" "2071-10-01" "2071-11-01" "2071-12-01" "2072-01-01" "2072-02-01" "2072-03-01"
 [820] "2072-04-01" "2072-05-01" "2072-06-01" "2072-07-01" "2072-08-01" "2072-09-01" "2072-10-01"
 [827] "2072-11-01" "2072-12-01" "2073-01-01" "2073-02-01" "2073-03-01" "2073-04-01" "2073-05-01"
 [834] "2073-06-01" "2073-07-01" "2073-08-01" "2073-09-01" "2073-10-01" "2073-11-01" "2073-12-01"
 [841] "2074-01-01" "2074-02-01" "2074-03-01" "2074-04-01" "2074-05-01" "2074-06-01" "2074-07-01"
 [848] "2074-08-01" "2074-09-01" "2074-10-01" "2074-11-01" "2074-12-01" "2075-01-01" "2075-02-01"
 [855] "2075-03-01" "2075-04-01" "2075-05-01" "2075-06-01" "2075-07-01" "2075-08-01" "2075-09-01"
 [862] "2075-10-01" "2075-11-01" "2075-12-01" "2076-01-01" "2076-02-01" "2076-03-01" "2076-04-01"
 [869] "2076-05-01" "2076-06-01" "2076-07-01" "2076-08-01" "2076-09-01" "2076-10-01" "2076-11-01"
 [876] "2076-12-01" "2077-01-01" "2077-02-01" "2077-03-01" "2077-04-01" "2077-05-01" "2077-06-01"
 [883] "2077-07-01" "2077-08-01" "2077-09-01" "2077-10-01" "2077-11-01" "2077-12-01" "2078-01-01"
 [890] "2078-02-01" "2078-03-01" "2078-04-01" "2078-05-01" "2078-06-01" "2078-07-01" "2078-08-01"
 [897] "2078-09-01" "2078-10-01" "2078-11-01" "2078-12-01" "2079-01-01" "2079-02-01" "2079-03-01"
 [904] "2079-04-01" "2079-05-01" "2079-06-01" "2079-07-01" "2079-08-01" "2079-09-01" "2079-10-01"
 [911] "2079-11-01" "2079-12-01" "2080-01-01" "2080-02-01" "2080-03-01" "2080-04-01" "2080-05-01"
 [918] "2080-06-01" "2080-07-01" "2080-08-01" "2080-09-01" "2080-10-01" "2080-11-01" "2080-12-01"
 [925] "2081-01-01" "2081-02-01" "2081-03-01" "2081-04-01" "2081-05-01" "2081-06-01" "2081-07-01"
 [932] "2081-08-01" "2081-09-01" "2081-10-01" "2081-11-01" "2081-12-01" "2082-01-01" "2082-02-01"
 [939] "2082-03-01" "2082-04-01" "2082-05-01" "2082-06-01" "2082-07-01" "2082-08-01" "2082-09-01"
 [946] "2082-10-01" "2082-11-01" "2082-12-01" "2083-01-01" "2083-02-01" "2083-03-01" "2083-04-01"
 [953] "2083-05-01" "2083-06-01" "2083-07-01" "2083-08-01" "2083-09-01" "2083-10-01" "2083-11-01"
 [960] "2083-12-01" "2084-01-01" "2084-02-01" "2084-03-01" "2084-04-01" "2084-05-01" "2084-06-01"
 [967] "2084-07-01" "2084-08-01" "2084-09-01" "2084-10-01" "2084-11-01" "2084-12-01" "2085-01-01"
 [974] "2085-02-01" "2085-03-01" "2085-04-01" "2085-05-01" "2085-06-01" "2085-07-01" "2085-08-01"
 [981] "2085-09-01" "2085-10-01" "2085-11-01" "2085-12-01" "2086-01-01" "2086-02-01" "2086-03-01"
 [988] "2086-04-01" "2086-05-01" "2086-06-01" "2086-07-01" "2086-08-01" "2086-09-01" "2086-10-01"
 [995] "2086-11-01" "2086-12-01" "2087-01-01" "2087-02-01" "2087-03-01" "2087-04-01"
 [ reached getOption("max.print") -- omitted 164 entries ]
time <-as.Date(time)
out <- as.matrix(CRD45_out_response)         ## convert from coda to matrix

code from AMW for splitting up this matrix

x_cols <- grep('^x', colnames(out))
obs_cols <- grep('^OBS', colnames(out))

out_x <- out[,x_cols]
out_obs <- out[,obs_cols]

rm(out)

out_x <- t(out_x)

out_x <- as.data.frame(out_x)
out_x2 <- out_x |>
  tibble::rownames_to_column(var = 'time_pond') |>
  dplyr::mutate(timestep = sub(x = time_pond,
                               pattern = '.*x\\[',
                               replacement = ''),
                timestep = sub(x = timestep,
                               pattern = ',.*',
                               replacement = ''),
                pond = sub(x = time_pond,
                           pattern = '.*,',
                           replacement = ''),
                pond = sub(x = pond,
                           pattern = '\\]',
                           replacement = '')) |>
  tidyr::pivot_longer(-c(time_pond, timestep, pond),
                      names_to = 'iter', values_to = 'val') |>
  dplyr::group_by(pond, timestep) |>
  dplyr::summarize(low = quantile(val, probs = 0.025),
                   med = median(val),
                   high = quantile(val, probs = 0.975))
`summarise()` has grouped output by 'pond'. You can override using the `.groups` argument.
timesteps <- as.data.frame(time)
timesteps$ind <- as.character(seq(from = 1, to = nrow(timesteps), by = 1))
colnames(timesteps) <- c('time', 'timestep')

ponds <- as.data.frame(colnames(CR_WaterTemp45[-1]))
ponds$ind <- as.character(seq(from = 1, to = nrow(ponds), by = 1))
colnames(ponds) <- c('pond_name', 'pond')

out_x_mapped <- out_x2 |>
  dplyr::left_join(y = timesteps, by = 'timestep') |>
  dplyr::left_join(y = ponds, by = 'pond') |>
  dplyr::select(low, med, high, time, pond_name)
Adding missing grouping variables: `pond`
pX <- out_x_mapped |>
  ggplot2::ggplot() +
  ggplot2::geom_line(ggplot2::aes(x = time, y = med)) +
  ggplot2::geom_ribbon(ggplot2::aes(x = time, ymin = low, ymax = high)) +
  ggplot2::facet_wrap(~pond_name)

out_obs <- t(out_obs)

out_obs <- as.data.frame(out_obs)

out_obs2 <- out_obs |>
  tibble::rownames_to_column(var = 'time_pond') |>
  dplyr::mutate(timestep = sub(x = time_pond,
                               pattern = '.*OBS\\[',
                               replacement = ''),
                timestep = sub(x = timestep,
                               pattern = ',.*',
                               replacement = ''),
                pond = sub(x = time_pond,
                           pattern = '.*,',
                           replacement = ''),
                pond = sub(x = pond,
                           pattern = '\\]',
                           replacement = '')) |>
  tidyr::pivot_longer(-c(time_pond, timestep, pond),
                      names_to = 'iter', values_to = 'val') |>
  dplyr::group_by(pond, timestep) |>
  dplyr::summarize(low = quantile(val, probs = 0.025),
                   med = median(val),
                   high = quantile(val, probs = 0.975))
`summarise()` has grouped output by 'pond'. You can override using the `.groups` argument.
out_obs_mapped <- out_obs2 |>
  dplyr::left_join(y = timesteps, by = 'timestep') |>
  dplyr::left_join(y = ponds, by = 'pond') |>
  dplyr::select(low, med, high, time, pond_name)
Adding missing grouping variables: `pond`
pOBS <- out_obs_mapped |>
  ggplot2::ggplot() +
  ggplot2::geom_line(ggplot2::aes(x = time, y = med)) +
  ggplot2::geom_ribbon(ggplot2::aes(x = time, ymin = low, ymax = high)) +
  ggplot2::facet_wrap(~pond_name)

cowplot::plot_grid(pX, pOBS)

Probability of Crossing Threshold

threshold_probs <- out_obs |>
  tibble::rownames_to_column(var = 'time_pond') |>
  dplyr::mutate(timestep = sub(x = time_pond,
                               pattern = '.*OBS\\[',
                               replacement = ''),
                timestep = sub(x = timestep,
                               pattern = ',.*',
                               replacement = ''),
                pond = sub(x = time_pond,
                           pattern = '.*,',
                           replacement = ''),
                pond = sub(x = pond,
                           pattern = '\\]',
                           replacement = '')) |>
  tidyr::pivot_longer(-c(time_pond, timestep, pond),
                      names_to = 'iter', values_to = 'val') |>
  dplyr::group_by(pond, timestep) |>
  dplyr::summarize(n_iter = dplyr::n(),
                   n_thresh = sum(val > 20),
                   prob = (n_thresh / n_iter) * 100)
`summarise()` has grouped output by 'pond'. You can override using the `.groups` argument.
threshold_probs_mapped <- threshold_probs |>
  dplyr::left_join(y = timesteps, by = 'timestep') |>
  dplyr::left_join(y = ponds, by = 'pond')

threshold_probs_mapped |>
  ggplot2::ggplot() +
  ggplot2::geom_line(ggplot2::aes(x = time, y = prob)) +
  ggplot2::facet_wrap(~pond_name)

Save these ouputs using a .RDataFile type

save.image(file = "Corr_PooledMod_CRD45.RData")

Making Graphs

Load in this file here as long as no code changes are needed above

load(file = "Corr_PooledMod_CRD45.RData")

Creating some nice plots of these

  1. colored panel plot (each ponds forecast with the median, high, and low plus a trend line)
# set up the colors here for the plots below so that each pond has the same color each time
Mod_CRD45 <- out_obs_mapped
str(Mod_CRD45)
gropd_df [10,476 × 6] (S3: grouped_df/tbl_df/tbl/data.frame)
 $ pond     : chr [1:10476] "1" "1" "1" "1" ...
 $ low      : Named num [1:10476] -6.549 6.28 -2.714 -0.219 2.658 ...
  ..- attr(*, "names")= chr [1:10476] "2.5%" "2.5%" "2.5%" "2.5%" ...
 $ med      : num [1:10476] -0.375 6.28 1.316 3.694 6.286 ...
 $ high     : Named num [1:10476] 5.95 6.28 5.03 7.62 9.96 ...
  ..- attr(*, "names")= chr [1:10476] "97.5%" "97.5%" "97.5%" "97.5%" ...
 $ time     : Date[1:10476], format: "2012-01-01" "2012-10-01" "2012-04-01" ...
 $ pond_name: chr [1:10476] "BVS" "BVS" "BVS" "BVS" ...
 - attr(*, "groups")= tibble [9 × 2] (S3: tbl_df/tbl/data.frame)
  ..$ pond : chr [1:9] "1" "2" "3" "4" ...
  ..$ .rows: list<int> [1:9] 
  .. ..$ : int [1:1164] 1 2 3 4 5 6 7 8 9 10 ...
  .. ..$ : int [1:1164] 1165 1166 1167 1168 1169 1170 1171 1172 1173 1174 ...
  .. ..$ : int [1:1164] 2329 2330 2331 2332 2333 2334 2335 2336 2337 2338 ...
  .. ..$ : int [1:1164] 3493 3494 3495 3496 3497 3498 3499 3500 3501 3502 ...
  .. ..$ : int [1:1164] 4657 4658 4659 4660 4661 4662 4663 4664 4665 4666 ...
  .. ..$ : int [1:1164] 5821 5822 5823 5824 5825 5826 5827 5828 5829 5830 ...
  .. ..$ : int [1:1164] 6985 6986 6987 6988 6989 6990 6991 6992 6993 6994 ...
  .. ..$ : int [1:1164] 8149 8150 8151 8152 8153 8154 8155 8156 8157 8158 ...
  .. ..$ : int [1:1164] 9313 9314 9315 9316 9317 9318 9319 9320 9321 9322 ...
  .. ..@ ptype: int(0) 
  ..- attr(*, ".drop")= logi TRUE
write.csv(Mod_CRD45, "Corr_Mod_CRD45.csv")

# Define the custom color palette
CR_colors <- c("#E41A1C", "#377EB8", "#4DAF4A", "#984EA3", "#FF7F00", "#FFFF33", "#A65628", "#F781BF", "lightblue")

# Ensure that CR_colors has the same length as the number of unique ponds
unique_ponds <- unique(Mod_CRD45$pond_name)
if (length(CR_colors) != length(unique_ponds)) {
  stop("The number of colors in CR_colors does not match the number of unique ponds.")
}

# Create a named vector for CR_colors with pond names
color_mapping <- setNames(CR_colors, unique_ponds)

# Plotting
Ponds_CRD45 <- ggplot(data = Mod_CRD45, aes(x = time)) +
  geom_ribbon(aes(ymin = low, ymax = high, fill = pond_name)) +  # Add the ribbon with colors
  geom_line(aes(y = med, color = pond_name)) +  # Ensure lines are visible and colored by pond
  geom_smooth(aes(y = med, color = "grey"), size = 1) +  # Ensure lines are visible and colored by pond
  geom_vline(xintercept = as.Date("2020-12-01"), linetype = "dashed", color = "red") +  # Add vertical dashed red line
  facet_wrap(~ pond_name) +  # Facet by pond_name
  scale_color_manual(values = color_mapping) +  # Use custom colors for lines
  scale_fill_manual(values = color_mapping) +   # Use custom colors for ribbons
  xlab("Year") +
  ylab("Water Temperature (°C)") +
  theme_classic() +
  theme(plot.title = element_text(hjust = 0.5, size = 24),
        axis.title = element_text(size = 22),
        axis.text = element_text(size = 20),
        axis.text.x = element_text(angle = 45, hjust = 1),
        legend.position = "none",
        strip.text = element_text(size = 16))
Ponds_CRD45
`geom_smooth()` using method = 'gam' and formula = 'y ~ s(x, bs = "cs")'
ggsave("Corr_IndPonds_CRD45.png", plot = Ponds_CRD45, width = 8, height = 6)
`geom_smooth()` using method = 'gam' and formula = 'y ~ s(x, bs = "cs")'

  1. Trend by pond (geom smooth for each pond on the same plot for comparison)
# using the same aestetics as above

Trends_CRD45 <- ggplot(data = Mod_CRD45, aes(x = time)) +
  geom_smooth(aes(y = med, color = pond_name, fill = pond_name), alpha = 0.15, size = 1) +  # Smooth lines with colors by pond_name
  scale_color_manual(values = color_mapping) +
  scale_fill_manual(values = color_mapping) +   # Use custom colors for ribbons
  labs(
       x = "Year",
       y = "Water Temperature (°C)",
       color = "Pond Name",
       fill = "Pond Name") +  # Labels for legend
  theme_classic() +
  theme(plot.title = element_text(hjust = 0.5, size = 18),
        axis.title = element_text(size = 22),
        axis.text = element_text(size = 20),
        legend.position = "right",
        legend.text = element_text(size = 16), # Change the legend text size here
        legend.title = element_text(size = 20)) # Position the legend on the right
Trends_CRD45
`geom_smooth()` using method = 'gam' and formula = 'y ~ s(x, bs = "cs")'
ggsave("Corr_IndTrends_CRD45.png", plot = Trends_CRD45, width = 9, height = 6)
`geom_smooth()` using method = 'gam' and formula = 'y ~ s(x, bs = "cs")'

  1. probability plot (by pond)
probs_CRD45 <- threshold_probs_mapped
write.csv(probs_CRD45, "Corr_probs_CRD45.csv")

Probs20_CRD45 <- ggplot(data = probs_CRD45, aes(x = time)) +
  geom_line(aes(y = prob, color = pond_name)) +  # Ensure lines are visible and colored by pond
  facet_wrap(~ pond_name) +  # Facet by pond_name
  scale_color_manual(values = color_mapping) +  # Use custom colors for lines
  xlab("Year") +
  ylab("Probability") +
  xlim(as.Date(c("2020-12-01", "2099-12-01"))) +
  ylim(0,50) +
  theme_classic() +
  theme(plot.title = element_text(hjust = 0.5, size = 18),
        axis.title = element_text(size = 22),
        axis.text = element_text(size = 18),
        axis.text.x = element_text(angle = 55, hjust = 1),
        legend.position = "none",
        strip.text = element_text(size = 16))
Probs20_CRD45
Warning: Removed 1935 rows containing missing values or values outside the scale range (`geom_line()`).
ggsave("Corr_Probs20_CRD45.png", plot = Probs20_CRD45, width = 9, height = 6)
Warning: Removed 1935 rows containing missing values or values outside the scale range (`geom_line()`).

  1. Model fits by pond
Mod_CRD45

ModObs <- Mod_CRD45 %>%
  filter(time < "2021-01-01")
range(ModObs$time)
[1] "2012-01-01" "2020-12-01"
ModelErrorPlot_CRD45 <- ggplot(data = ModObs, aes(x = time)) +
  geom_ribbon(aes(ymin = low, ymax = high, fill = pond_name)) +  # Adjust fill colors
  geom_line(aes(y = med), color = "black") +  # Black lines for the median values
  facet_wrap(~ pond_name) +  # Facet by pond_name
  scale_fill_manual(values = color_mapping) +  # Apply custom color palette for ribbons
  labs(
       x = "Year",
       y = "Water Temperature (°C)",
       color = "Pond Name",
       fill = "Pond Name") +  # Labels for legend
  theme_classic() +
  theme(
    plot.title = element_text(hjust = 0.5),
    axis.title = element_text(size = 16),
    axis.text = element_text(size = 14),
    axis.text.x = element_text(angle = 45, hjust = 1),
    legend.position = "none" # Angle x-axis labels if needed
  )
ModelErrorPlot_CRD45

ggsave("Corr_Error_CRD45.png", plot = ModelErrorPlot_CRD45, width = 9, height = 6)

Clear out the environment and reload the basics before starting the next section

rm(list = ls())

library(tidyverse)
library(rjags)
library(ggplot2)

set.seed(1)

RCP 8.5

Design the Model

Read in the data here, which is an output of XX code file

Then separate the data into air and water temperature files

# Air and water temperature data: CR loccation, 4.5 scenario
CR_Temps <- read.csv("CR_85SNAPForecast.csv", header=TRUE)

# Air temperature variables
CR_AirTemp85 <- CR_Temps %>%
  select(date, Airport, Air_MonthAvg, std, precision, Region)

# Water temperature variables
CR_WaterTemp85 <- CR_Temps %>%
  select(date, BVS, CAB, TIN, SQR, CAN, EYS, TIS, WDD, RHM)


# Set up a string of all the dates
time <- CR_WaterTemp85$date
length(time)
[1] 1164

Setting up the random walk model

dlm_pooled <- "
model{
#### Priors
for(p in 1:np){
x[1,p] ~ dnorm(x_ic, tau_ic) # Initial condition of water temperature
}
tau_obs ~ dgamma(a_obs, r_obs) # Prior on observation error
tau_add ~ dgamma(a_add, r_add) # Prior on process error

#### Fixed Effects
beta ~ dmnorm(mu_beta, tau_beta) # Prior on beta coefficients

for(p in 1:np){
int[p] ~ dnorm(mu_int, tau_int) # Prior on pond-specific intercepts
}

#### Data Model
for(t in 1:n){ # loop over all time steps
for(p in 1:np){
OBS[t,p] ~ dnorm(x[t,p], tau_obs) # Observed water temperature is drawn from latent air temperature with observation uncertainty
}
Xf[t] ~ dnorm(muAirTemp[t], tauAirTemp[t]) # Latent air temperature is drawn from mean and precision of forecasated air temperature
}

#### Process Model
for(t in 2:n){ # loop over all time steps except teh first (we defined ic above)
for(p in 1:np){
mu[t,p] <- x[t-1,p] + int[p] + beta[1] * x[t-1,p] + beta[2] * Xf[t] # Mean water temperature is a function of the previous time step and current air temperature
x[t,p] ~ dnorm(mu[t,p], tau_add) # Latent water temperature is drawn from mean water temperature with process uncertainty
}
}
}
"

Define the data and priors for the model

# Empty list
data <- list()
# Water temperature observations
data$OBS <- dplyr::select(CR_WaterTemp85, -date)
# Number of time steps
data$n <- nrow(data$OBS)
# Number of ponds
data$np <- ncol(data$OBS)
# Initial water temperature mean
data$x_ic <- 0.1
# Initial water temperature precision
data$tau_ic = 0.1
# Prior parameters for observation and process uncertainty
data$a_obs = 1
data$r_obs = 1
data$a_add = 1
data$r_add = 1
# Prior parameters for beta coefficients
data$mu_beta <- c(0, 0)
data$tau_beta <- diag(x = c(0.001, 0.001), nrow = 2, ncol = 2)
# Prior parameters for intercept
data$mu_int <- 0
data$tau_int <- 0.001
# Mean air temperature estimate
data$muAirTemp <- CR_AirTemp85$Air_MonthAvg
# Air temperature precision
data$tauAirTemp <- CR_AirTemp85$precision

Create JAGS model with 3 chains

jm <- jags.model(file = textConnection(dlm_pooled), data = data, n.chains = 3)
Compiling model graph
   Resolving undeclared variables
   Allocating nodes
Graph information:
   Observed stochastic nodes: 448
   Unobserved stochastic nodes: 21680
   Total graph size: 46573

Initializing model

Posterior samples of parameters

CRD85_out_params <- coda.samples(model = jm,
                               variable.names = c('beta', 'int',
                                                  'tau_add', 'tau_obs'),
                               n.iter = 50000, thin = 25)

  |                                                        
  |                                                  |   0%
  |                                                        
  |*                                                 |   2%
  |                                                        
  |**                                                |   4%
  |                                                        
  |***                                               |   6%
  |                                                        
  |****                                              |   8%
  |                                                        
  |*****                                             |  10%
  |                                                        
  |******                                            |  12%
  |                                                        
  |*******                                           |  14%
  |                                                        
  |********                                          |  16%
  |                                                        
  |*********                                         |  18%
  |                                                        
  |**********                                        |  20%
  |                                                        
  |***********                                       |  22%
  |                                                        
  |************                                      |  24%
  |                                                        
  |*************                                     |  26%
  |                                                        
  |**************                                    |  28%
  |                                                        
  |***************                                   |  30%
  |                                                        
  |****************                                  |  32%
  |                                                        
  |*****************                                 |  34%
  |                                                        
  |******************                                |  36%
  |                                                        
  |*******************                               |  38%
  |                                                        
  |********************                              |  40%
  |                                                        
  |*********************                             |  42%
  |                                                        
  |**********************                            |  44%
  |                                                        
  |***********************                           |  46%
  |                                                        
  |************************                          |  48%
  |                                                        
  |*************************                         |  50%
  |                                                        
  |**************************                        |  52%
  |                                                        
  |***************************                       |  54%
  |                                                        
  |****************************                      |  56%
  |                                                        
  |*****************************                     |  58%
  |                                                        
  |******************************                    |  60%
  |                                                        
  |*******************************                   |  62%
  |                                                        
  |********************************                  |  64%
  |                                                        
  |*********************************                 |  66%
  |                                                        
  |**********************************                |  68%
  |                                                        
  |***********************************               |  70%
  |                                                        
  |************************************              |  72%
  |                                                        
  |*************************************             |  74%
  |                                                        
  |**************************************            |  76%
  |                                                        
  |***************************************           |  78%
  |                                                        
  |****************************************          |  80%
  |                                                        
  |*****************************************         |  82%
  |                                                        
  |******************************************        |  84%
  |                                                        
  |*******************************************       |  86%
  |                                                        
  |********************************************      |  88%
  |                                                        
  |*********************************************     |  90%
  |                                                        
  |**********************************************    |  92%
  |                                                        
  |***********************************************   |  94%
  |                                                        
  |************************************************  |  96%
  |                                                        
  |************************************************* |  98%
  |                                                        
  |**************************************************| 100%

Posterior samples of response variables

CRD85_out_response <- coda.samples(model = jm,
                                 variable.names = c('x', 'OBS'),
                                 n.iter = 100000, thin = 25)

  |                                                        
  |                                                  |   0%
  |                                                        
  |*                                                 |   2%
  |                                                        
  |**                                                |   4%
  |                                                        
  |***                                               |   6%
  |                                                        
  |****                                              |   8%
  |                                                        
  |*****                                             |  10%
  |                                                        
  |******                                            |  12%
  |                                                        
  |*******                                           |  14%
  |                                                        
  |********                                          |  16%
  |                                                        
  |*********                                         |  18%
  |                                                        
  |**********                                        |  20%
  |                                                        
  |***********                                       |  22%
  |                                                        
  |************                                      |  24%
  |                                                        
  |*************                                     |  26%
  |                                                        
  |**************                                    |  28%
  |                                                        
  |***************                                   |  30%
  |                                                        
  |****************                                  |  32%
  |                                                        
  |*****************                                 |  34%
  |                                                        
  |******************                                |  36%
  |                                                        
  |*******************                               |  38%
  |                                                        
  |********************                              |  40%
  |                                                        
  |*********************                             |  42%
  |                                                        
  |**********************                            |  44%
  |                                                        
  |***********************                           |  46%
  |                                                        
  |************************                          |  48%
  |                                                        
  |*************************                         |  50%
  |                                                        
  |**************************                        |  52%
  |                                                        
  |***************************                       |  54%
  |                                                        
  |****************************                      |  56%
  |                                                        
  |*****************************                     |  58%
  |                                                        
  |******************************                    |  60%
  |                                                        
  |*******************************                   |  62%
  |                                                        
  |********************************                  |  64%
  |                                                        
  |*********************************                 |  66%
  |                                                        
  |**********************************                |  68%
  |                                                        
  |***********************************               |  70%
  |                                                        
  |************************************              |  72%
  |                                                        
  |*************************************             |  74%
  |                                                        
  |**************************************            |  76%
  |                                                        
  |***************************************           |  78%
  |                                                        
  |****************************************          |  80%
  |                                                        
  |*****************************************         |  82%
  |                                                        
  |******************************************        |  84%
  |                                                        
  |*******************************************       |  86%
  |                                                        
  |********************************************      |  88%
  |                                                        
  |*********************************************     |  90%
  |                                                        
  |**********************************************    |  92%
  |                                                        
  |***********************************************   |  94%
  |                                                        
  |************************************************  |  96%
  |                                                        
  |************************************************* |  98%
  |                                                        
  |**************************************************| 100%

A couple quick checks here

# plot(CRD85_out_params)
gelman.diag(CRD85_out_params, confidence = 0.99)
Potential scale reduction factors:

        Point est. Upper C.I.
beta[1]          1       1.00
beta[2]          1       1.01
int[1]           1       1.00
int[2]           1       1.02
int[3]           1       1.01
int[4]           1       1.01
int[5]           1       1.01
int[6]           1       1.01
int[7]           1       1.00
int[8]           1       1.01
int[9]           1       1.01
tau_add          1       1.00
tau_obs          1       1.01

Multivariate psrf

1.01

Visualize the output by just looking at the 95% credible interval of the time-series of X’s and compare that to the observed Y’s

Transform the samples back from the log domain to the linear domain

time                               ## adjust to zoom in and out
   [1] "2012-01-01" "2012-02-01" "2012-03-01" "2012-04-01" "2012-05-01" "2012-06-01" "2012-07-01"
   [8] "2012-08-01" "2012-09-01" "2012-10-01" "2012-11-01" "2012-12-01" "2013-01-01" "2013-02-01"
  [15] "2013-03-01" "2013-04-01" "2013-05-01" "2013-06-01" "2013-07-01" "2013-08-01" "2013-09-01"
  [22] "2013-10-01" "2013-11-01" "2013-12-01" "2014-01-01" "2014-02-01" "2014-03-01" "2014-04-01"
  [29] "2014-05-01" "2014-06-01" "2014-07-01" "2014-08-01" "2014-09-01" "2014-10-01" "2014-11-01"
  [36] "2014-12-01" "2015-01-01" "2015-02-01" "2015-03-01" "2015-04-01" "2015-05-01" "2015-06-01"
  [43] "2015-07-01" "2015-08-01" "2015-09-01" "2015-10-01" "2015-11-01" "2015-12-01" "2016-01-01"
  [50] "2016-02-01" "2016-03-01" "2016-04-01" "2016-05-01" "2016-06-01" "2016-07-01" "2016-08-01"
  [57] "2016-09-01" "2016-10-01" "2016-11-01" "2016-12-01" "2017-01-01" "2017-02-01" "2017-03-01"
  [64] "2017-04-01" "2017-05-01" "2017-06-01" "2017-07-01" "2017-08-01" "2017-09-01" "2017-10-01"
  [71] "2017-11-01" "2017-12-01" "2018-01-01" "2018-02-01" "2018-03-01" "2018-04-01" "2018-05-01"
  [78] "2018-06-01" "2018-07-01" "2018-08-01" "2018-09-01" "2018-10-01" "2018-11-01" "2018-12-01"
  [85] "2019-01-01" "2019-02-01" "2019-03-01" "2019-04-01" "2019-05-01" "2019-06-01" "2019-07-01"
  [92] "2019-08-01" "2019-09-01" "2019-10-01" "2019-11-01" "2019-12-01" "2012-01-01" "2012-02-01"
  [99] "2012-03-01" "2012-04-01" "2012-05-01" "2012-06-01" "2012-07-01" "2012-08-01" "2012-09-01"
 [106] "2012-10-01" "2012-11-01" "2012-12-01" "2013-01-01" "2013-02-01" "2013-03-01" "2013-04-01"
 [113] "2013-05-01" "2013-06-01" "2013-07-01" "2013-08-01" "2013-09-01" "2013-10-01" "2013-11-01"
 [120] "2013-12-01" "2014-01-01" "2014-02-01" "2014-03-01" "2014-04-01" "2014-05-01" "2014-06-01"
 [127] "2014-07-01" "2014-08-01" "2014-09-01" "2014-10-01" "2014-11-01" "2014-12-01" "2015-01-01"
 [134] "2015-02-01" "2015-03-01" "2015-04-01" "2015-05-01" "2015-06-01" "2015-07-01" "2015-08-01"
 [141] "2015-09-01" "2015-10-01" "2015-11-01" "2015-12-01" "2016-01-01" "2016-02-01" "2016-03-01"
 [148] "2016-04-01" "2016-05-01" "2016-06-01" "2016-07-01" "2016-08-01" "2016-09-01" "2016-10-01"
 [155] "2016-11-01" "2016-12-01" "2017-01-01" "2017-02-01" "2017-03-01" "2017-04-01" "2017-05-01"
 [162] "2017-06-01" "2017-07-01" "2017-08-01" "2017-09-01" "2017-10-01" "2017-11-01" "2017-12-01"
 [169] "2018-01-01" "2018-02-01" "2018-03-01" "2018-04-01" "2018-05-01" "2018-06-01" "2018-07-01"
 [176] "2018-08-01" "2018-09-01" "2018-10-01" "2018-11-01" "2018-12-01" "2019-01-01" "2019-02-01"
 [183] "2019-03-01" "2019-04-01" "2019-05-01" "2019-06-01" "2019-07-01" "2019-08-01" "2019-09-01"
 [190] "2019-10-01" "2019-11-01" "2019-12-01" "2020-01-01" "2020-02-01" "2020-03-01" "2020-04-01"
 [197] "2020-05-01" "2020-06-01" "2020-07-01" "2020-08-01" "2020-09-01" "2020-10-01" "2020-11-01"
 [204] "2020-12-01" "2021-01-01" "2021-02-01" "2021-03-01" "2021-04-01" "2021-05-01" "2021-06-01"
 [211] "2021-07-01" "2021-08-01" "2021-09-01" "2021-10-01" "2021-11-01" "2021-12-01" "2022-01-01"
 [218] "2022-02-01" "2022-03-01" "2022-04-01" "2022-05-01" "2022-06-01" "2022-07-01" "2022-08-01"
 [225] "2022-09-01" "2022-10-01" "2022-11-01" "2022-12-01" "2023-01-01" "2023-02-01" "2023-03-01"
 [232] "2023-04-01" "2023-05-01" "2023-06-01" "2023-07-01" "2023-08-01" "2023-09-01" "2023-10-01"
 [239] "2023-11-01" "2023-12-01" "2024-01-01" "2024-02-01" "2024-03-01" "2024-04-01" "2024-05-01"
 [246] "2024-06-01" "2024-07-01" "2024-08-01" "2024-09-01" "2024-10-01" "2024-11-01" "2024-12-01"
 [253] "2025-01-01" "2025-02-01" "2025-03-01" "2025-04-01" "2025-05-01" "2025-06-01" "2025-07-01"
 [260] "2025-08-01" "2025-09-01" "2025-10-01" "2025-11-01" "2025-12-01" "2026-01-01" "2026-02-01"
 [267] "2026-03-01" "2026-04-01" "2026-05-01" "2026-06-01" "2026-07-01" "2026-08-01" "2026-09-01"
 [274] "2026-10-01" "2026-11-01" "2026-12-01" "2027-01-01" "2027-02-01" "2027-03-01" "2027-04-01"
 [281] "2027-05-01" "2027-06-01" "2027-07-01" "2027-08-01" "2027-09-01" "2027-10-01" "2027-11-01"
 [288] "2027-12-01" "2028-01-01" "2028-02-01" "2028-03-01" "2028-04-01" "2028-05-01" "2028-06-01"
 [295] "2028-07-01" "2028-08-01" "2028-09-01" "2028-10-01" "2028-11-01" "2028-12-01" "2029-01-01"
 [302] "2029-02-01" "2029-03-01" "2029-04-01" "2029-05-01" "2029-06-01" "2029-07-01" "2029-08-01"
 [309] "2029-09-01" "2029-10-01" "2029-11-01" "2029-12-01" "2030-01-01" "2030-02-01" "2030-03-01"
 [316] "2030-04-01" "2030-05-01" "2030-06-01" "2030-07-01" "2030-08-01" "2030-09-01" "2030-10-01"
 [323] "2030-11-01" "2030-12-01" "2031-01-01" "2031-02-01" "2031-03-01" "2031-04-01" "2031-05-01"
 [330] "2031-06-01" "2031-07-01" "2031-08-01" "2031-09-01" "2031-10-01" "2031-11-01" "2031-12-01"
 [337] "2032-01-01" "2032-02-01" "2032-03-01" "2032-04-01" "2032-05-01" "2032-06-01" "2032-07-01"
 [344] "2032-08-01" "2032-09-01" "2032-10-01" "2032-11-01" "2032-12-01" "2033-01-01" "2033-02-01"
 [351] "2033-03-01" "2033-04-01" "2033-05-01" "2033-06-01" "2033-07-01" "2033-08-01" "2033-09-01"
 [358] "2033-10-01" "2033-11-01" "2033-12-01" "2034-01-01" "2034-02-01" "2034-03-01" "2034-04-01"
 [365] "2034-05-01" "2034-06-01" "2034-07-01" "2034-08-01" "2034-09-01" "2034-10-01" "2034-11-01"
 [372] "2034-12-01" "2035-01-01" "2035-02-01" "2035-03-01" "2035-04-01" "2035-05-01" "2035-06-01"
 [379] "2035-07-01" "2035-08-01" "2035-09-01" "2035-10-01" "2035-11-01" "2035-12-01" "2036-01-01"
 [386] "2036-02-01" "2036-03-01" "2036-04-01" "2036-05-01" "2036-06-01" "2036-07-01" "2036-08-01"
 [393] "2036-09-01" "2036-10-01" "2036-11-01" "2036-12-01" "2037-01-01" "2037-02-01" "2037-03-01"
 [400] "2037-04-01" "2037-05-01" "2037-06-01" "2037-07-01" "2037-08-01" "2037-09-01" "2037-10-01"
 [407] "2037-11-01" "2037-12-01" "2038-01-01" "2038-02-01" "2038-03-01" "2038-04-01" "2038-05-01"
 [414] "2038-06-01" "2038-07-01" "2038-08-01" "2038-09-01" "2038-10-01" "2038-11-01" "2038-12-01"
 [421] "2039-01-01" "2039-02-01" "2039-03-01" "2039-04-01" "2039-05-01" "2039-06-01" "2039-07-01"
 [428] "2039-08-01" "2039-09-01" "2039-10-01" "2039-11-01" "2039-12-01" "2040-01-01" "2040-02-01"
 [435] "2040-03-01" "2040-04-01" "2040-05-01" "2040-06-01" "2040-07-01" "2040-08-01" "2040-09-01"
 [442] "2040-10-01" "2040-11-01" "2040-12-01" "2041-01-01" "2041-02-01" "2041-03-01" "2041-04-01"
 [449] "2041-05-01" "2041-06-01" "2041-07-01" "2041-08-01" "2041-09-01" "2041-10-01" "2041-11-01"
 [456] "2041-12-01" "2042-01-01" "2042-02-01" "2042-03-01" "2042-04-01" "2042-05-01" "2042-06-01"
 [463] "2042-07-01" "2042-08-01" "2042-09-01" "2042-10-01" "2042-11-01" "2042-12-01" "2043-01-01"
 [470] "2043-02-01" "2043-03-01" "2043-04-01" "2043-05-01" "2043-06-01" "2043-07-01" "2043-08-01"
 [477] "2043-09-01" "2043-10-01" "2043-11-01" "2043-12-01" "2044-01-01" "2044-02-01" "2044-03-01"
 [484] "2044-04-01" "2044-05-01" "2044-06-01" "2044-07-01" "2044-08-01" "2044-09-01" "2044-10-01"
 [491] "2044-11-01" "2044-12-01" "2045-01-01" "2045-02-01" "2045-03-01" "2045-04-01" "2045-05-01"
 [498] "2045-06-01" "2045-07-01" "2045-08-01" "2045-09-01" "2045-10-01" "2045-11-01" "2045-12-01"
 [505] "2046-01-01" "2046-02-01" "2046-03-01" "2046-04-01" "2046-05-01" "2046-06-01" "2046-07-01"
 [512] "2046-08-01" "2046-09-01" "2046-10-01" "2046-11-01" "2046-12-01" "2047-01-01" "2047-02-01"
 [519] "2047-03-01" "2047-04-01" "2047-05-01" "2047-06-01" "2047-07-01" "2047-08-01" "2047-09-01"
 [526] "2047-10-01" "2047-11-01" "2047-12-01" "2048-01-01" "2048-02-01" "2048-03-01" "2048-04-01"
 [533] "2048-05-01" "2048-06-01" "2048-07-01" "2048-08-01" "2048-09-01" "2048-10-01" "2048-11-01"
 [540] "2048-12-01" "2049-01-01" "2049-02-01" "2049-03-01" "2049-04-01" "2049-05-01" "2049-06-01"
 [547] "2049-07-01" "2049-08-01" "2049-09-01" "2049-10-01" "2049-11-01" "2049-12-01" "2050-01-01"
 [554] "2050-02-01" "2050-03-01" "2050-04-01" "2050-05-01" "2050-06-01" "2050-07-01" "2050-08-01"
 [561] "2050-09-01" "2050-10-01" "2050-11-01" "2050-12-01" "2051-01-01" "2051-02-01" "2051-03-01"
 [568] "2051-04-01" "2051-05-01" "2051-06-01" "2051-07-01" "2051-08-01" "2051-09-01" "2051-10-01"
 [575] "2051-11-01" "2051-12-01" "2052-01-01" "2052-02-01" "2052-03-01" "2052-04-01" "2052-05-01"
 [582] "2052-06-01" "2052-07-01" "2052-08-01" "2052-09-01" "2052-10-01" "2052-11-01" "2052-12-01"
 [589] "2053-01-01" "2053-02-01" "2053-03-01" "2053-04-01" "2053-05-01" "2053-06-01" "2053-07-01"
 [596] "2053-08-01" "2053-09-01" "2053-10-01" "2053-11-01" "2053-12-01" "2054-01-01" "2054-02-01"
 [603] "2054-03-01" "2054-04-01" "2054-05-01" "2054-06-01" "2054-07-01" "2054-08-01" "2054-09-01"
 [610] "2054-10-01" "2054-11-01" "2054-12-01" "2055-01-01" "2055-02-01" "2055-03-01" "2055-04-01"
 [617] "2055-05-01" "2055-06-01" "2055-07-01" "2055-08-01" "2055-09-01" "2055-10-01" "2055-11-01"
 [624] "2055-12-01" "2056-01-01" "2056-02-01" "2056-03-01" "2056-04-01" "2056-05-01" "2056-06-01"
 [631] "2056-07-01" "2056-08-01" "2056-09-01" "2056-10-01" "2056-11-01" "2056-12-01" "2057-01-01"
 [638] "2057-02-01" "2057-03-01" "2057-04-01" "2057-05-01" "2057-06-01" "2057-07-01" "2057-08-01"
 [645] "2057-09-01" "2057-10-01" "2057-11-01" "2057-12-01" "2058-01-01" "2058-02-01" "2058-03-01"
 [652] "2058-04-01" "2058-05-01" "2058-06-01" "2058-07-01" "2058-08-01" "2058-09-01" "2058-10-01"
 [659] "2058-11-01" "2058-12-01" "2059-01-01" "2059-02-01" "2059-03-01" "2059-04-01" "2059-05-01"
 [666] "2059-06-01" "2059-07-01" "2059-08-01" "2059-09-01" "2059-10-01" "2059-11-01" "2059-12-01"
 [673] "2060-01-01" "2060-02-01" "2060-03-01" "2060-04-01" "2060-05-01" "2060-06-01" "2060-07-01"
 [680] "2060-08-01" "2060-09-01" "2060-10-01" "2060-11-01" "2060-12-01" "2061-01-01" "2061-02-01"
 [687] "2061-03-01" "2061-04-01" "2061-05-01" "2061-06-01" "2061-07-01" "2061-08-01" "2061-09-01"
 [694] "2061-10-01" "2061-11-01" "2061-12-01" "2062-01-01" "2062-02-01" "2062-03-01" "2062-04-01"
 [701] "2062-05-01" "2062-06-01" "2062-07-01" "2062-08-01" "2062-09-01" "2062-10-01" "2062-11-01"
 [708] "2062-12-01" "2063-01-01" "2063-02-01" "2063-03-01" "2063-04-01" "2063-05-01" "2063-06-01"
 [715] "2063-07-01" "2063-08-01" "2063-09-01" "2063-10-01" "2063-11-01" "2063-12-01" "2064-01-01"
 [722] "2064-02-01" "2064-03-01" "2064-04-01" "2064-05-01" "2064-06-01" "2064-07-01" "2064-08-01"
 [729] "2064-09-01" "2064-10-01" "2064-11-01" "2064-12-01" "2065-01-01" "2065-02-01" "2065-03-01"
 [736] "2065-04-01" "2065-05-01" "2065-06-01" "2065-07-01" "2065-08-01" "2065-09-01" "2065-10-01"
 [743] "2065-11-01" "2065-12-01" "2066-01-01" "2066-02-01" "2066-03-01" "2066-04-01" "2066-05-01"
 [750] "2066-06-01" "2066-07-01" "2066-08-01" "2066-09-01" "2066-10-01" "2066-11-01" "2066-12-01"
 [757] "2067-01-01" "2067-02-01" "2067-03-01" "2067-04-01" "2067-05-01" "2067-06-01" "2067-07-01"
 [764] "2067-08-01" "2067-09-01" "2067-10-01" "2067-11-01" "2067-12-01" "2068-01-01" "2068-02-01"
 [771] "2068-03-01" "2068-04-01" "2068-05-01" "2068-06-01" "2068-07-01" "2068-08-01" "2068-09-01"
 [778] YF_WaterTemp85 "2068-11-01" "2068-12-01" "2069-01-01" "2069-02-01" "2069-03-01" "2069-04-01"
 [785] "2069-05-01" "2069-06-01" "2069-07-01" "2069-08-01" "2069-09-01" "2069-10-01" "2069-11-01"
 [792] "2069-12-01" "2070-01-01" "2070-02-01" "2070-03-01" "2070-04-01" "2070-05-01" "2070-06-01"
 [799] "2070-07-01" "2070-08-01" "2070-09-01" "2070-10-01" "2070-11-01" "2070-12-01" "2071-01-01"
 [806] "2071-02-01" "2071-03-01" "2071-04-01" "2071-05-01" "2071-06-01" "2071-07-01" "2071-08-01"
 [813] "2071-09-01" "2071-10-01" "2071-11-01" "2071-12-01" "2072-01-01" "2072-02-01" "2072-03-01"
 [820] "2072-04-01" "2072-05-01" "2072-06-01" "2072-07-01" "2072-08-01" "2072-09-01" "2072-10-01"
 [827] "2072-11-01" "2072-12-01" "2073-01-01" "2073-02-01" "2073-03-01" "2073-04-01" "2073-05-01"
 [834] "2073-06-01" "2073-07-01" "2073-08-01" "2073-09-01" "2073-10-01" "2073-11-01" "2073-12-01"
 [841] "2074-01-01" "2074-02-01" "2074-03-01" "2074-04-01" "2074-05-01" "2074-06-01" "2074-07-01"
 [848] "2074-08-01" "2074-09-01" "2074-10-01" "2074-11-01" "2074-12-01" "2075-01-01" "2075-02-01"
 [855] "2075-03-01" "2075-04-01" "2075-05-01" "2075-06-01" "2075-07-01" "2075-08-01" "2075-09-01"
 [862] "2075-10-01" "2075-11-01" "2075-12-01" "2076-01-01" "2076-02-01" "2076-03-01" "2076-04-01"
 [869] "2076-05-01" "2076-06-01" "2076-07-01" "2076-08-01" "2076-09-01" "2076-10-01" "2076-11-01"
 [876] "2076-12-01" "2077-01-01" "2077-02-01" "2077-03-01" "2077-04-01" "2077-05-01" "2077-06-01"
 [883] "2077-07-01" "2077-08-01" "2077-09-01" "2077-10-01" "2077-11-01" "2077-12-01" "2078-01-01"
 [890] "2078-02-01" "2078-03-01" "2078-04-01" "2078-05-01" "2078-06-01" "2078-07-01" "2078-08-01"
 [897] "2078-09-01" "2078-10-01" "2078-11-01" "2078-12-01" "2079-01-01" "2079-02-01" "2079-03-01"
 [904] "2079-04-01" "2079-05-01" "2079-06-01" "2079-07-01" "2079-08-01" "2079-09-01" "2079-10-01"
 [911] "2079-11-01" "2079-12-01" "2080-01-01" "2080-02-01" "2080-03-01" "2080-04-01" "2080-05-01"
 [918] "2080-06-01" "2080-07-01" "2080-08-01" "2080-09-01" "2080-10-01" "2080-11-01" "2080-12-01"
 [925] "2081-01-01" "2081-02-01" "2081-03-01" "2081-04-01" "2081-05-01" "2081-06-01" "2081-07-01"
 [932] "2081-08-01" "2081-09-01" "2081-10-01" "2081-11-01" "2081-12-01" "2082-01-01" "2082-02-01"
 [939] "2082-03-01" "2082-04-01" "2082-05-01" "2082-06-01" "2082-07-01" "2082-08-01" "2082-09-01"
 [946] "2082-10-01" "2082-11-01" "2082-12-01" "2083-01-01" "2083-02-01" "2083-03-01" "2083-04-01"
 [953] "2083-05-01" "2083-06-01" "2083-07-01" "2083-08-01" "2083-09-01" "2083-10-01" "2083-11-01"
 [960] "2083-12-01" "2084-01-01" "2084-02-01" "2084-03-01" "2084-04-01" "2084-05-01" "2084-06-01"
 [967] "2084-07-01" "2084-08-01" "2084-09-01" "2084-10-01" "2084-11-01" "2084-12-01" "2085-01-01"
 [974] "2085-02-01" "2085-03-01" "2085-04-01" "2085-05-01" "2085-06-01" "2085-07-01" "2085-08-01"
 [981] "2085-09-01" "2085-10-01" "2085-11-01" "2085-12-01" "2086-01-01" "2086-02-01" "2086-03-01"
 [988] "2086-04-01" "2086-05-01" "2086-06-01" "2086-07-01" "2086-08-01" "2086-09-01" "2086-10-01"
 [995] "2086-11-01" "2086-12-01" "2087-01-01" "2087-02-01" "2087-03-01" "2087-04-01"
 [ reached getOption("max.print") -- omitted 164 entries ]
time <-as.Date(time)
out <- as.matrix(CRD85_out_response)         ## convert from coda to matrix

code from AMW for splitting up this matrix

x_cols <- grep('^x', colnames(out))
obs_cols <- grep('^OBS', colnames(out))

out_x <- out[,x_cols]
out_obs <- out[,obs_cols]

rm(out)

out_x <- t(out_x)

out_x <- as.data.frame(out_x)
out_x2 <- out_x |>
  tibble::rownames_to_column(var = 'time_pond') |>
  dplyr::mutate(timestep = sub(x = time_pond,
                               pattern = '.*x\\[',
                               replacement = ''),
                timestep = sub(x = timestep,
                               pattern = ',.*',
                               replacement = ''),
                pond = sub(x = time_pond,
                           pattern = '.*,',
                           replacement = ''),
                pond = sub(x = pond,
                           pattern = '\\]',
                           replacement = '')) |>
  tidyr::pivot_longer(-c(time_pond, timestep, pond),
                      names_to = 'iter', values_to = 'val') |>
  dplyr::group_by(pond, timestep) |>
  dplyr::summarize(low = quantile(val, probs = 0.025),
                   med = median(val),
                   high = quantile(val, probs = 0.975))
`summarise()` has grouped output by 'pond'. You can override using the `.groups` argument.
timesteps <- as.data.frame(time)
timesteps$ind <- as.character(seq(from = 1, to = nrow(timesteps), by = 1))
colnames(timesteps) <- c('time', 'timestep')

ponds <- as.data.frame(colnames(CR_WaterTemp85[-1]))
ponds$ind <- as.character(seq(from = 1, to = nrow(ponds), by = 1))
colnames(ponds) <- c('pond_name', 'pond')

out_x_mapped <- out_x2 |>
  dplyr::left_join(y = timesteps, by = 'timestep') |>
  dplyr::left_join(y = ponds, by = 'pond') |>
  dplyr::select(low, med, high, time, pond_name)
Adding missing grouping variables: `pond`
pX <- out_x_mapped |>
  ggplot2::ggplot() +
  ggplot2::geom_line(ggplot2::aes(x = time, y = med)) +
  ggplot2::geom_ribbon(ggplot2::aes(x = time, ymin = low, ymax = high)) +
  ggplot2::facet_wrap(~pond_name)

out_obs <- t(out_obs)

out_obs <- as.data.frame(out_obs)

out_obs2 <- out_obs |>
  tibble::rownames_to_column(var = 'time_pond') |>
  dplyr::mutate(timestep = sub(x = time_pond,
                               pattern = '.*OBS\\[',
                               replacement = ''),
                timestep = sub(x = timestep,
                               pattern = ',.*',
                               replacement = ''),
                pond = sub(x = time_pond,
                           pattern = '.*,',
                           replacement = ''),
                pond = sub(x = pond,
                           pattern = '\\]',
                           replacement = '')) |>
  tidyr::pivot_longer(-c(time_pond, timestep, pond),
                      names_to = 'iter', values_to = 'val') |>
  dplyr::group_by(pond, timestep) |>
  dplyr::summarize(low = quantile(val, probs = 0.025),
                   med = median(val),
                   high = quantile(val, probs = 0.975))
`summarise()` has grouped output by 'pond'. You can override using the `.groups` argument.
out_obs_mapped <- out_obs2 |>
  dplyr::left_join(y = timesteps, by = 'timestep') |>
  dplyr::left_join(y = ponds, by = 'pond') |>
  dplyr::select(low, med, high, time, pond_name)
Adding missing grouping variables: `pond`
pOBS <- out_obs_mapped |>
  ggplot2::ggplot() +
  ggplot2::geom_line(ggplot2::aes(x = time, y = med)) +
  ggplot2::geom_ribbon(ggplot2::aes(x = time, ymin = low, ymax = high)) +
  ggplot2::facet_wrap(~pond_name)

cowplot::plot_grid(pX, pOBS)

Probability of Crossing Threshold

threshold_probs <- out_obs |>
  tibble::rownames_to_column(var = 'time_pond') |>
  dplyr::mutate(timestep = sub(x = time_pond,
                               pattern = '.*OBS\\[',
                               replacement = ''),
                timestep = sub(x = timestep,
                               pattern = ',.*',
                               replacement = ''),
                pond = sub(x = time_pond,
                           pattern = '.*,',
                           replacement = ''),
                pond = sub(x = pond,
                           pattern = '\\]',
                           replacement = '')) |>
  tidyr::pivot_longer(-c(time_pond, timestep, pond),
                      names_to = 'iter', values_to = 'val') |>
  dplyr::group_by(pond, timestep) |>
  dplyr::summarize(n_iter = dplyr::n(),
                   n_thresh = sum(val > 20),
                   prob = (n_thresh / n_iter) * 100)
`summarise()` has grouped output by 'pond'. You can override using the `.groups` argument.
threshold_probs_mapped <- threshold_probs |>
  dplyr::left_join(y = timesteps, by = 'timestep') |>
  dplyr::left_join(y = ponds, by = 'pond')

threshold_probs_mapped |>
  ggplot2::ggplot() +
  ggplot2::geom_line(ggplot2::aes(x = time, y = prob)) +
  ggplot2::facet_wrap(~pond_name)

Save these ouputs using a .RDataFile type

save.image(file = "Corr_PooledMod_CRD85.RData")

#Currently this has all the information in it. Eventually could limit this to be just the relavent information for the remaining code below

Makeing Graphs

Load in this file here as long as no code changes are needed above

load(file = "Corr_PooledMod_CRD85.RData")

Creating some nice plots of these

  1. colored panel plot (each ponds forecast with the median, high, and low plus a trend line)
# set up the colors here for the plots below so that each pond has the same color each time
Mod_CRD85 <- out_obs_mapped
str(Mod_CRD85)
gropd_df [10,476 × 6] (S3: grouped_df/tbl_df/tbl/data.frame)
 $ pond     : chr [1:10476] "1" "1" "1" "1" ...
 $ low      : Named num [1:10476] -6.53 6.28 -3.61 1.54 3.74 ...
  ..- attr(*, "names")= chr [1:10476] "2.5%" "2.5%" "2.5%" "2.5%" ...
 $ med      : num [1:10476] -0.351 6.28 0.736 5.619 8.518 ...
 $ high     : Named num [1:10476] 5.77 6.28 4.8 9.64 13.36 ...
  ..- attr(*, "names")= chr [1:10476] "97.5%" "97.5%" "97.5%" "97.5%" ...
 $ time     : Date[1:10476], format: "2012-01-01" "2012-10-01" "2012-04-01" ...
 $ pond_name: chr [1:10476] "BVS" "BVS" "BVS" "BVS" ...
 - attr(*, "groups")= tibble [9 × 2] (S3: tbl_df/tbl/data.frame)
  ..$ pond : chr [1:9] "1" "2" "3" "4" ...
  ..$ .rows: list<int> [1:9] 
  .. ..$ : int [1:1164] 1 2 3 4 5 6 7 8 9 10 ...
  .. ..$ : int [1:1164] 1165 1166 1167 1168 1169 1170 1171 1172 1173 1174 ...
  .. ..$ : int [1:1164] 2329 2330 2331 2332 2333 2334 2335 2336 2337 2338 ...
  .. ..$ : int [1:1164] 3493 3494 3495 3496 3497 3498 3499 3500 3501 3502 ...
  .. ..$ : int [1:1164] 4657 4658 4659 4660 4661 4662 4663 4664 4665 4666 ...
  .. ..$ : int [1:1164] 5821 5822 5823 5824 5825 5826 5827 5828 5829 5830 ...
  .. ..$ : int [1:1164] 6985 6986 6987 6988 6989 6990 6991 6992 6993 6994 ...
  .. ..$ : int [1:1164] 8149 8150 8151 8152 8153 8154 8155 8156 8157 8158 ...
  .. ..$ : int [1:1164] 9313 9314 9315 9316 9317 9318 9319 9320 9321 9322 ...
  .. ..@ ptype: int(0) 
  ..- attr(*, ".drop")= logi TRUE
write.csv(Mod_CRD85, "Corr_Mod_CRD85.csv")

# Define the custom color palette
CR_colors <- c("#E41A1C", "#377EB8", "#4DAF4A", "#984EA3", "#FF7F00", "#FFFF33", "#A65628", "#F781BF", "lightblue")

# Ensure that CR_colors has the same length as the number of unique ponds
unique_ponds <- unique(Mod_CRD85$pond_name)
if (length(CR_colors) != length(unique_ponds)) {
  stop("The number of colors in CR_colors does not match the number of unique ponds.")
}

# Create a named vector for CR_colors with pond names
color_mapping <- setNames(CR_colors, unique_ponds)

# Plotting
Ponds_CRD85 <- ggplot(data = Mod_CRD85, aes(x = time)) +
  geom_ribbon(aes(ymin = low, ymax = high, fill = pond_name)) +  # Add the ribbon with colors
  geom_line(aes(y = med, color = pond_name)) +  # Ensure lines are visible and colored by pond
  geom_smooth(aes(y = med, color = "grey"), size = 1) +  # Ensure lines are visible and colored by pond
  geom_vline(xintercept = as.Date("2020-12-01"), linetype = "dashed", color = "red") +  # Add vertical dashed red line
  facet_wrap(~ pond_name) +  # Facet by pond_name
  scale_color_manual(values = color_mapping) +  # Use custom colors for lines
  scale_fill_manual(values = color_mapping) +   # Use custom colors for ribbons
  xlab("Year") +
  ylab("Water Temperature (°C)") +
  theme_classic() +
  theme(plot.title = element_text(hjust = 0.5, size = 24),
        axis.title = element_text(size = 22),
        axis.text = element_text(size = 20),
        axis.text.x = element_text(angle = 45, hjust = 1),
        legend.position = "none",
        strip.text = element_text(size = 16))
Ponds_CRD85
`geom_smooth()` using method = 'gam' and formula = 'y ~ s(x, bs = "cs")'
ggsave("Corr_IndPonds_CRD85.png", plot = Ponds_CRD85, width = 8, height = 6)
`geom_smooth()` using method = 'gam' and formula = 'y ~ s(x, bs = "cs")'

  1. trend by pond (geom smooth for each pond on the same plot for comparison)
# using the same aestetics as above

Trends_CRD85 <- ggplot(data = Mod_CRD85, aes(x = time)) +
  geom_smooth(aes(y = med, color = pond_name, fill = pond_name), alpha = 0.15, size = 1) +  # Smooth lines with colors by pond_name
  scale_color_manual(values = color_mapping) +
  scale_fill_manual(values = color_mapping) +   # Use custom colors for ribbons
  labs(
       x = "Year",
       y = "Water Temperature (°C)",
       color = "Pond Name",
       fill = "Pond Name") +  # Labels for legend
  theme_classic() +
  theme(plot.title = element_text(hjust = 0.5, size = 18),
        axis.title = element_text(size = 22),
        axis.text = element_text(size = 20),
        legend.position = "right",
        legend.text = element_text(size = 16), # Change the legend text size here
        legend.title = element_text(size = 20))
Trends_CRD85
`geom_smooth()` using method = 'gam' and formula = 'y ~ s(x, bs = "cs")'
ggsave("Corr_IndTrends_CRD85.png", plot = Trends_CRD85, width = 9, height = 6)
`geom_smooth()` using method = 'gam' and formula = 'y ~ s(x, bs = "cs")'

  1. probability plot (by pond)
probs_CRD85 <- threshold_probs_mapped
write.csv(probs_CRD85, "probs_CRD85.csv")

Probs20_CRD85 <- ggplot(data = probs_CRD85, aes(x = time)) +
  geom_line(aes(y = prob, color = pond_name)) +  # Ensure lines are visible and colored by pond
  facet_wrap(~ pond_name) +  # Facet by pond_name
  scale_color_manual(values = color_mapping) +  # Use custom colors for lines
  xlab("Year") +
  ylab("Probability") +
  xlim(as.Date(c("2020-12-01", "2099-12-01"))) +
  ylim(0,50) +
  theme_classic() +
  theme(plot.title = element_text(hjust = 0.5, size = 18),
        axis.title = element_text(size = 22),
        axis.text = element_text(size = 18),
        axis.text.x = element_text(angle = 55, hjust = 1),
        legend.position = "none",
        strip.text = element_text(size = 16))
Probs20_CRD85
Warning: Removed 1935 rows containing missing values or values outside the scale range (`geom_line()`).
ggsave("Corr_Probs20_CRD85.png", plot = Probs20_CRD85, width = 9, height = 6)
Warning: Removed 1935 rows containing missing values or values outside the scale range (`geom_line()`).

  1. Model fits by pond
Mod_CRD85

ModObs <- Mod_CRD85 %>%
  filter(time < "2021-01-01")
range(ModObs$time)
[1] "2012-01-01" "2020-12-01"
ModelErrorPlot_CRD85 <- ggplot(data = ModObs, aes(x = time)) +
  geom_ribbon(aes(ymin = low, ymax = high, fill = pond_name)) +  # Adjust fill colors
  geom_line(aes(y = med), color = "black") +  # Black lines for the median values
  facet_wrap(~ pond_name) +  # Facet by pond_name
  scale_fill_manual(values = color_mapping) +  # Apply custom color palette for ribbons
  labs(
       x = "Year",
       y = "Water Temperature (°C)",
       color = "Pond Name",
       fill = "Pond Name") +  # Labels for legend
  theme_classic() +
  theme(plot.title = element_text(hjust = 0.5, size = 24),
        axis.title = element_text(size = 22),
        axis.text = element_text(size = 20),
        axis.text.x = element_text(angle = 45, hjust = 1),
        legend.position = "none",
        strip.text = element_text(size = 16))
ModelErrorPlot_CRD85

ggsave("Corr_Error_CRD85.png", plot = ModelErrorPlot_CRD85, width = 9, height = 6)

Calculating NSE values

Mod_CRD85

# Filter this to only the observational data
obs_CRD85 <- Mod_CRD85 %>%
  filter(time < as.Date("2020-01-01")) %>%
  ungroup() %>%
  as.data.frame()

# Convert the 'date' column in CR_WaterTemp85 to Date type and rename it to 'time'
CR_WaterTemp85 <- CR_WaterTemp85 %>%
  mutate(time = as.Date(date))

# BVS ####
BVS_CRD <- obs_CRD85 %>%
  filter(pond_name == "BVS")

# Perform the merge to combine the data frames based on the time/date columns
BVS_combined <- BVS_CRD %>%
  select(time, med) %>%
  left_join(CR_WaterTemp85, by = "time")
Warning in left_join(., CR_WaterTemp85, by = "time") :
  Detected an unexpected many-to-many relationship between `x` and `y`.
ℹ Row 1 of `x` matches multiple rows in `y`.
ℹ Row 10 of `y` matches multiple rows in `x`.
ℹ If a many-to-many relationship is expected, set `relationship = "many-to-many"` to silence this
  warning.
BVS_NSE <- NSE(BVS_combined$med, BVS_combined$BVS, na.rm = TRUE)
BVS_NSE
[1] 0.7038907
# CAB ####
CAB_CRD <- obs_CRD85 %>%
  filter(pond_name == "CAB")

# Perform the merge to combine the data frames based on the time/date columns
CAB_combined <- CAB_CRD %>%
  select(time, med) %>%
  left_join(CR_WaterTemp85, by = "time")
Warning in left_join(., CR_WaterTemp85, by = "time") :
  Detected an unexpected many-to-many relationship between `x` and `y`.
ℹ Row 1 of `x` matches multiple rows in `y`.
ℹ Row 10 of `y` matches multiple rows in `x`.
ℹ If a many-to-many relationship is expected, set `relationship = "many-to-many"` to silence this
  warning.
CAB_NSE <- NSE(CAB_combined$med, CAB_combined$CAB, na.rm = TRUE)
CAB_NSE
[1] 0.8513042
# CAN ####
CAN_CRD <- obs_CRD85 %>%
  filter(pond_name == "CAN")

# Perform the merge to combine the data frames based on the time/date columns
CAN_combined <- CAN_CRD %>%
  select(time, med) %>%
  left_join(CR_WaterTemp85, by = "time")
Warning in left_join(., CR_WaterTemp85, by = "time") :
  Detected an unexpected many-to-many relationship between `x` and `y`.
ℹ Row 1 of `x` matches multiple rows in `y`.
ℹ Row 10 of `y` matches multiple rows in `x`.
ℹ If a many-to-many relationship is expected, set `relationship = "many-to-many"` to silence this
  warning.
CAN_NSE <- NSE(CAN_combined$med, CAN_combined$CAN, na.rm = TRUE)
CAN_NSE
[1] 0.8422728
# CAN ####
CAN_CRD <- obs_CRD85 %>%
  filter(pond_name == "CAN")

# Perform the merge to combine the data frames based on the time/date columns
CAN_combined <- CAN_CRD %>%
  select(time, med) %>%
  left_join(CR_WaterTemp85, by = "time")
Warning in left_join(., CR_WaterTemp85, by = "time") :
  Detected an unexpected many-to-many relationship between `x` and `y`.
ℹ Row 1 of `x` matches multiple rows in `y`.
ℹ Row 10 of `y` matches multiple rows in `x`.
ℹ If a many-to-many relationship is expected, set `relationship = "many-to-many"` to silence this
  warning.
CAN_NSE <- NSE(CAN_combined$med, CAN_combined$CAN, na.rm = TRUE)
CAN_NSE
[1] 0.8422728

Clear out the environment and reload the basics before starting the next section

rm(list = ls())

library(tidyverse)
library(rjags)
library(ggplot2)

set.seed(1)

Continueing with Yakutat Forelands (YF)

RCP 4.5

Design the Model

Read in the data here, which is an output of XX code file

Then separate the data into air and water temperature files

# Air and water temperature data: YF loccation, 4.5 scenario
YF_Temps <- read.csv("BiasCorrection/Geo_BiasCorrection/DataFiles/SNAP_YF45_corrected_monthly.csv", header=TRUE)

# Air temperature variables
YF_AirTemp45 <- YF_Temps %>%
  select(date, Airport, Air_MonthAvg, std, precision, Region)
Error in `select()`:
! Can't select columns that don't exist.
✖ Column `Airport` doesn't exist.
Backtrace:
 1. YF_Temps %>% ...
 3. dplyr:::select.data.frame(., date, Airport, Air_MonthAvg, std, precision, Region)

Setting up the random walk model

dlm_pooled <- "
model{
#### Priors
for(p in 1:np){
x[1,p] ~ dnorm(x_ic, tau_ic) # Initial condition of water temperature
}
tau_obs ~ dgamma(a_obs, r_obs) # Prior on observation error
tau_add ~ dgamma(a_add, r_add) # Prior on process error

#### Fixed Effects
beta ~ dmnorm(mu_beta, tau_beta) # Prior on beta coefficients

for(p in 1:np){
int[p] ~ dnorm(mu_int, tau_int) # Prior on pond-specific intercepts
}

#### Data Model
for(t in 1:n){ # loop over all time steps
for(p in 1:np){
OBS[t,p] ~ dnorm(x[t,p], tau_obs) # Observed water temperature is drawn from latent air temperature with observation uncertainty
}
Xf[t] ~ dnorm(muAirTemp[t], tauAirTemp[t]) # Latent air temperature is drawn from mean and precision of forecasated air temperature
}

#### Process Model
for(t in 2:n){ # loop over all time steps except teh first (we defined ic above)
for(p in 1:np){
mu[t,p] <- x[t-1,p] + int[p] + beta[1] * x[t-1,p] + beta[2] * Xf[t] # Mean water temperature is a function of the previous time step and current air temperature
x[t,p] ~ dnorm(mu[t,p], tau_add) # Latent water temperature is drawn from mean water temperature with process uncertainty
}
}
}
"

Define the data and priors for the model

# Empty list
data <- list()
# Water temperature observations
data$OBS <- dplyr::select(YF_WaterTemp45, -date)
# Number of time steps
data$n <- nrow(data$OBS)
# Number of ponds
data$np <- ncol(data$OBS)
# Initial water temperature mean
data$x_ic <- 0.1
# Initial water temperature precision
data$tau_ic = 0.1
# Prior parameters for observation and process uncertainty
data$a_obs = 1
data$r_obs = 1
data$a_add = 1
data$r_add = 1
# Prior parameters for beta coefficients
data$mu_beta <- c(0, 0)
data$tau_beta <- diag(x = c(0.001, 0.001), nrow = 2, ncol = 2)
# Prior parameters for intercept
data$mu_int <- 0
data$tau_int <- 0.001
# Mean air temperature estimate
data$muAirTemp <- YF_AirTemp45$Air_MonthAvg
# Air temperature precision
data$tauAirTemp <- YF_AirTemp45$precision

Create JAGS model with 3 chains

jm <- jags.model(file = textConnection(dlm_pooled), data = data, n.chains = 3)
Compiling model graph
   Resolving undeclared variables
   Allocating nodes
Graph information:
   Observed stochastic nodes: 456
   Unobserved stochastic nodes: 26330
   Total graph size: 55883

Initializing model

Posterior samples of parameters

YF45_out_params <- coda.samples(model = jm,
                               variable.names = c('beta', 'int',
                                                  'tau_add', 'tau_obs'),
                               n.iter = 100000, thin = 25)

  |                                                        
  |                                                  |   0%
  |                                                        
  |*                                                 |   2%
  |                                                        
  |**                                                |   4%
  |                                                        
  |***                                               |   6%
  |                                                        
  |****                                              |   8%
  |                                                        
  |*****                                             |  10%
  |                                                        
  |******                                            |  12%
  |                                                        
  |*******                                           |  14%
  |                                                        
  |********                                          |  16%
  |                                                        
  |*********                                         |  18%
  |                                                        
  |**********                                        |  20%
  |                                                        
  |***********                                       |  22%
  |                                                        
  |************                                      |  24%
  |                                                        
  |*************                                     |  26%
  |                                                        
  |**************                                    |  28%
  |                                                        
  |***************                                   |  30%
  |                                                        
  |****************                                  |  32%
  |                                                        
  |*****************                                 |  34%
  |                                                        
  |******************                                |  36%
  |                                                        
  |*******************                               |  38%
  |                                                        
  |********************                              |  40%
  |                                                        
  |*********************                             |  42%
  |                                                        
  |**********************                            |  44%
  |                                                        
  |***********************                           |  46%
  |                                                        
  |************************                          |  48%
  |                                                        
  |*************************                         |  50%
  |                                                        
  |**************************                        |  52%
  |                                                        
  |***************************                       |  54%
  |                                                        
  |****************************                      |  56%
  |                                                        
  |*****************************                     |  58%
  |                                                        
  |******************************                    |  60%
  |                                                        
  |*******************************                   |  62%
  |                                                        
  |********************************                  |  64%
  |                                                        
  |*********************************                 |  66%
  |                                                        
  |**********************************                |  68%
  |                                                        
  |***********************************               |  70%
  |                                                        
  |************************************              |  72%
  |                                                        
  |*************************************             |  74%
  |                                                        
  |**************************************            |  76%
  |                                                        
  |***************************************           |  78%
  |                                                        
  |****************************************          |  80%
  |                                                        
  |*****************************************         |  82%
  |                                                        
  |******************************************        |  84%
  |                                                        
  |*******************************************       |  86%
  |                                                        
  |********************************************      |  88%
  |                                                        
  |*********************************************     |  90%
  |                                                        
  |**********************************************    |  92%
  |                                                        
  |***********************************************   |  94%
  |                                                        
  |************************************************  |  96%
  |                                                        
  |************************************************* |  98%
  |                                                        
  |**************************************************| 100%

Posterior samples of response variables

YF45_out_response <- coda.samples(model = jm,
                                 variable.names = c('x', 'OBS'),
                                 n.iter = 100000, thin = 25)

  |                                                        
  |                                                  |   0%
  |                                                        
  |*                                                 |   2%
  |                                                        
  |**                                                |   4%
  |                                                        
  |***                                               |   6%
  |                                                        
  |****                                              |   8%
  |                                                        
  |*****                                             |  10%
  |                                                        
  |******                                            |  12%
  |                                                        
  |*******                                           |  14%
  |                                                        
  |********                                          |  16%
  |                                                        
  |*********                                         |  18%
  |                                                        
  |**********                                        |  20%
  |                                                        
  |***********                                       |  22%
  |                                                        
  |************                                      |  24%
  |                                                        
  |*************                                     |  26%
  |                                                        
  |**************                                    |  28%
  |                                                        
  |***************                                   |  30%
  |                                                        
  |****************                                  |  32%
  |                                                        
  |*****************                                 |  34%
  |                                                        
  |******************                                |  36%
  |                                                        
  |*******************                               |  38%
  |                                                        
  |********************                              |  40%
  |                                                        
  |*********************                             |  42%
  |                                                        
  |**********************                            |  44%
  |                                                        
  |***********************                           |  46%
  |                                                        
  |************************                          |  48%
  |                                                        
  |*************************                         |  50%
  |                                                        
  |**************************                        |  52%
  |                                                        
  |***************************                       |  54%
  |                                                        
  |****************************                      |  56%
  |                                                        
  |*****************************                     |  58%
  |                                                        
  |******************************                    |  60%
  |                                                        
  |*******************************                   |  62%
  |                                                        
  |********************************                  |  64%
  |                                                        
  |*********************************                 |  66%
  |                                                        
  |**********************************                |  68%
  |                                                        
  |***********************************               |  70%
  |                                                        
  |************************************              |  72%
  |                                                        
  |*************************************             |  74%
  |                                                        
  |**************************************            |  76%
  |                                                        
  |***************************************           |  78%
  |                                                        
  |****************************************          |  80%
  |                                                        
  |*****************************************         |  82%
  |                                                        
  |******************************************        |  84%
  |                                                        
  |*******************************************       |  86%
  |                                                        
  |********************************************      |  88%
  |                                                        
  |*********************************************     |  90%
  |                                                        
  |**********************************************    |  92%
  |                                                        
  |***********************************************   |  94%
  |                                                        
  |************************************************  |  96%
  |                                                        
  |************************************************* |  98%
  |                                                        
  |**************************************************| 100%

A couple quick checks here

# plot(YF45_out_params)
gelman.diag(YF45_out_params, confidence = 0.99)
Potential scale reduction factors:

        Point est. Upper C.I.
beta[1]       1.00       1.02
beta[2]       1.00       1.01
int[1]        1.01       1.03
int[2]        1.01       1.02
int[3]        1.01       1.03
int[4]        1.01       1.03
int[5]        1.01       1.03
int[6]        1.01       1.03
int[7]        1.00       1.02
int[8]        1.01       1.02
int[9]        1.01       1.03
int[10]       1.01       1.03
int[11]       1.01       1.02
tau_add       1.00       1.01
tau_obs       1.00       1.00

Multivariate psrf

1.01

Visualize the output by just looking at the 95% credible interval of the time-series of X’s and compare that to the observed Y’s

Transform the samples back from the log domain to the linear domain

time                               ## adjust to zoom in and out
   [1] "2012-01-01" "2012-02-01" "2012-03-01" "2012-04-01" "2012-05-01" "2012-06-01" "2012-07-01"
   [8] "2012-08-01" "2012-09-01" "2012-10-01" "2012-11-01" "2012-12-01" "2013-01-01" "2013-02-01"
  [15] "2013-03-01" "2013-04-01" "2013-05-01" "2013-06-01" "2013-07-01" "2013-08-01" "2013-09-01"
  [22] "2013-10-01" "2013-11-01" "2013-12-01" "2014-01-01" "2014-02-01" "2014-03-01" "2014-04-01"
  [29] "2014-05-01" "2014-06-01" "2014-07-01" "2014-08-01" "2014-09-01" "2014-10-01" "2014-11-01"
  [36] "2014-12-01" "2015-01-01" "2015-02-01" "2015-03-01" "2015-04-01" "2015-05-01" "2015-06-01"
  [43] "2015-07-01" "2015-08-01" "2015-09-01" "2015-10-01" "2015-11-01" "2015-12-01" "2016-01-01"
  [50] "2016-02-01" "2016-03-01" "2016-04-01" "2016-05-01" "2016-06-01" "2016-07-01" "2016-08-01"
  [57] "2016-09-01" "2016-10-01" "2016-11-01" "2016-12-01" "2017-01-01" "2017-02-01" "2017-03-01"
  [64] "2017-04-01" "2017-05-01" "2017-06-01" "2017-07-01" "2017-08-01" "2017-09-01" "2017-10-01"
  [71] "2017-11-01" "2017-12-01" "2018-01-01" "2018-02-01" "2018-03-01" "2018-04-01" "2018-05-01"
  [78] "2018-06-01" "2018-07-01" "2018-08-01" "2018-09-01" "2018-10-01" "2018-11-01" "2018-12-01"
  [85] "2019-01-01" "2019-02-01" "2019-03-01" "2019-04-01" "2019-05-01" "2019-06-01" "2019-07-01"
  [92] "2019-08-01" "2019-09-01" "2019-10-01" "2019-11-01" "2019-12-01" "2012-01-01" "2012-02-01"
  [99] "2012-03-01" "2012-04-01" "2012-05-01" "2012-06-01" "2012-07-01" "2012-08-01" "2012-09-01"
 [106] "2012-10-01" "2012-11-01" "2012-12-01" "2013-01-01" "2013-02-01" "2013-03-01" "2013-04-01"
 [113] "2013-05-01" "2013-06-01" "2013-07-01" "2013-08-01" "2013-09-01" "2013-10-01" "2013-11-01"
 [120] "2013-12-01" "2014-01-01" "2014-02-01" "2014-03-01" "2014-04-01" "2014-05-01" "2014-06-01"
 [127] "2014-07-01" "2014-08-01" "2014-09-01" "2014-10-01" "2014-11-01" "2014-12-01" "2015-01-01"
 [134] "2015-02-01" "2015-03-01" "2015-04-01" "2015-05-01" "2015-06-01" "2015-07-01" "2015-08-01"
 [141] "2015-09-01" "2015-10-01" "2015-11-01" "2015-12-01" "2016-01-01" "2016-02-01" "2016-03-01"
 [148] "2016-04-01" "2016-05-01" "2016-06-01" "2016-07-01" "2016-08-01" "2016-09-01" "2016-10-01"
 [155] "2016-11-01" "2016-12-01" "2017-01-01" "2017-02-01" "2017-03-01" "2017-04-01" "2017-05-01"
 [162] "2017-06-01" "2017-07-01" "2017-08-01" "2017-09-01" "2017-10-01" "2017-11-01" "2017-12-01"
 [169] "2018-01-01" "2018-02-01" "2018-03-01" "2018-04-01" "2018-05-01" "2018-06-01" "2018-07-01"
 [176] "2018-08-01" "2018-09-01" "2018-10-01" "2018-11-01" "2018-12-01" "2019-01-01" "2019-02-01"
 [183] "2019-03-01" "2019-04-01" "2019-05-01" "2019-06-01" "2019-07-01" "2019-08-01" "2019-09-01"
 [190] "2019-10-01" "2019-11-01" "2019-12-01" "2020-01-01" "2020-02-01" "2020-03-01" "2020-04-01"
 [197] "2020-05-01" "2020-06-01" "2020-07-01" "2020-08-01" "2020-09-01" "2020-10-01" "2020-11-01"
 [204] "2020-12-01" "2021-01-01" "2021-02-01" "2021-03-01" "2021-04-01" "2021-05-01" "2021-06-01"
 [211] "2021-07-01" "2021-08-01" "2021-09-01" "2021-10-01" "2021-11-01" "2021-12-01" "2022-01-01"
 [218] "2022-02-01" "2022-03-01" "2022-04-01" "2022-05-01" "2022-06-01" "2022-07-01" "2022-08-01"
 [225] "2022-09-01" "2022-10-01" "2022-11-01" "2022-12-01" "2023-01-01" "2023-02-01" "2023-03-01"
 [232] "2023-04-01" "2023-05-01" "2023-06-01" "2023-07-01" "2023-08-01" "2023-09-01" "2023-10-01"
 [239] "2023-11-01" "2023-12-01" "2024-01-01" "2024-02-01" "2024-03-01" "2024-04-01" "2024-05-01"
 [246] "2024-06-01" "2024-07-01" "2024-08-01" "2024-09-01" "2024-10-01" "2024-11-01" "2024-12-01"
 [253] "2025-01-01" "2025-02-01" "2025-03-01" "2025-04-01" "2025-05-01" "2025-06-01" "2025-07-01"
 [260] "2025-08-01" "2025-09-01" "2025-10-01" "2025-11-01" "2025-12-01" "2026-01-01" "2026-02-01"
 [267] "2026-03-01" "2026-04-01" "2026-05-01" "2026-06-01" "2026-07-01" "2026-08-01" "2026-09-01"
 [274] "2026-10-01" "2026-11-01" "2026-12-01" "2027-01-01" "2027-02-01" "2027-03-01" "2027-04-01"
 [281] "2027-05-01" "2027-06-01" "2027-07-01" "2027-08-01" "2027-09-01" "2027-10-01" "2027-11-01"
 [288] "2027-12-01" "2028-01-01" "2028-02-01" "2028-03-01" "2028-04-01" "2028-05-01" "2028-06-01"
 [295] "2028-07-01" "2028-08-01" "2028-09-01" "2028-10-01" "2028-11-01" "2028-12-01" "2029-01-01"
 [302] "2029-02-01" "2029-03-01" "2029-04-01" "2029-05-01" "2029-06-01" "2029-07-01" "2029-08-01"
 [309] "2029-09-01" "2029-10-01" "2029-11-01" "2029-12-01" "2030-01-01" "2030-02-01" "2030-03-01"
 [316] "2030-04-01" "2030-05-01" "2030-06-01" "2030-07-01" "2030-08-01" "2030-09-01" "2030-10-01"
 [323] "2030-11-01" "2030-12-01" "2031-01-01" "2031-02-01" "2031-03-01" "2031-04-01" "2031-05-01"
 [330] "2031-06-01" "2031-07-01" "2031-08-01" "2031-09-01" "2031-10-01" "2031-11-01" "2031-12-01"
 [337] "2032-01-01" "2032-02-01" "2032-03-01" "2032-04-01" "2032-05-01" "2032-06-01" "2032-07-01"
 [344] "2032-08-01" "2032-09-01" "2032-10-01" "2032-11-01" "2032-12-01" "2033-01-01" "2033-02-01"
 [351] "2033-03-01" "2033-04-01" "2033-05-01" "2033-06-01" "2033-07-01" "2033-08-01" "2033-09-01"
 [358] "2033-10-01" "2033-11-01" "2033-12-01" "2034-01-01" "2034-02-01" "2034-03-01" "2034-04-01"
 [365] "2034-05-01" "2034-06-01" "2034-07-01" "2034-08-01" "2034-09-01" "2034-10-01" "2034-11-01"
 [372] "2034-12-01" "2035-01-01" "2035-02-01" "2035-03-01" "2035-04-01" "2035-05-01" "2035-06-01"
 [379] "2035-07-01" "2035-08-01" "2035-09-01" "2035-10-01" "2035-11-01" "2035-12-01" "2036-01-01"
 [386] "2036-02-01" "2036-03-01" "2036-04-01" "2036-05-01" "2036-06-01" "2036-07-01" "2036-08-01"
 [393] "2036-09-01" "2036-10-01" "2036-11-01" "2036-12-01" "2037-01-01" "2037-02-01" "2037-03-01"
 [400] "2037-04-01" "2037-05-01" "2037-06-01" "2037-07-01" "2037-08-01" "2037-09-01" "2037-10-01"
 [407] "2037-11-01" "2037-12-01" "2038-01-01" "2038-02-01" "2038-03-01" "2038-04-01" "2038-05-01"
 [414] "2038-06-01" "2038-07-01" "2038-08-01" "2038-09-01" "2038-10-01" "2038-11-01" "2038-12-01"
 [421] "2039-01-01" "2039-02-01" "2039-03-01" "2039-04-01" "2039-05-01" "2039-06-01" "2039-07-01"
 [428] "2039-08-01" "2039-09-01" "2039-10-01" "2039-11-01" "2039-12-01" "2040-01-01" "2040-02-01"
 [435] "2040-03-01" "2040-04-01" "2040-05-01" "2040-06-01" "2040-07-01" "2040-08-01" "2040-09-01"
 [442] "2040-10-01" "2040-11-01" "2040-12-01" "2041-01-01" "2041-02-01" "2041-03-01" "2041-04-01"
 [449] "2041-05-01" "2041-06-01" "2041-07-01" "2041-08-01" "2041-09-01" "2041-10-01" "2041-11-01"
 [456] "2041-12-01" "2042-01-01" "2042-02-01" "2042-03-01" "2042-04-01" "2042-05-01" "2042-06-01"
 [463] "2042-07-01" "2042-08-01" "2042-09-01" "2042-10-01" "2042-11-01" "2042-12-01" "2043-01-01"
 [470] "2043-02-01" "2043-03-01" "2043-04-01" "2043-05-01" "2043-06-01" "2043-07-01" "2043-08-01"
 [477] "2043-09-01" "2043-10-01" "2043-11-01" "2043-12-01" "2044-01-01" "2044-02-01" "2044-03-01"
 [484] "2044-04-01" "2044-05-01" "2044-06-01" "2044-07-01" "2044-08-01" "2044-09-01" "2044-10-01"
 [491] "2044-11-01" "2044-12-01" "2045-01-01" "2045-02-01" "2045-03-01" "2045-04-01" "2045-05-01"
 [498] "2045-06-01" "2045-07-01" "2045-08-01" "2045-09-01" "2045-10-01" "2045-11-01" "2045-12-01"
 [505] "2046-01-01" "2046-02-01" "2046-03-01" "2046-04-01" "2046-05-01" "2046-06-01" "2046-07-01"
 [512] "2046-08-01" "2046-09-01" "2046-10-01" "2046-11-01" "2046-12-01" "2047-01-01" "2047-02-01"
 [519] "2047-03-01" "2047-04-01" "2047-05-01" "2047-06-01" "2047-07-01" "2047-08-01" "2047-09-01"
 [526] "2047-10-01" "2047-11-01" "2047-12-01" "2048-01-01" "2048-02-01" "2048-03-01" "2048-04-01"
 [533] "2048-05-01" "2048-06-01" "2048-07-01" "2048-08-01" "2048-09-01" "2048-10-01" "2048-11-01"
 [540] "2048-12-01" "2049-01-01" "2049-02-01" "2049-03-01" "2049-04-01" "2049-05-01" "2049-06-01"
 [547] "2049-07-01" "2049-08-01" "2049-09-01" "2049-10-01" "2049-11-01" "2049-12-01" "2050-01-01"
 [554] "2050-02-01" "2050-03-01" "2050-04-01" "2050-05-01" "2050-06-01" "2050-07-01" "2050-08-01"
 [561] "2050-09-01" "2050-10-01" "2050-11-01" "2050-12-01" "2051-01-01" "2051-02-01" "2051-03-01"
 [568] "2051-04-01" "2051-05-01" "2051-06-01" "2051-07-01" "2051-08-01" "2051-09-01" "2051-10-01"
 [575] "2051-11-01" "2051-12-01" "2052-01-01" "2052-02-01" "2052-03-01" "2052-04-01" "2052-05-01"
 [582] "2052-06-01" "2052-07-01" "2052-08-01" "2052-09-01" "2052-10-01" "2052-11-01" "2052-12-01"
 [589] "2053-01-01" "2053-02-01" "2053-03-01" "2053-04-01" "2053-05-01" "2053-06-01" "2053-07-01"
 [596] "2053-08-01" "2053-09-01" "2053-10-01" "2053-11-01" "2053-12-01" "2054-01-01" "2054-02-01"
 [603] "2054-03-01" "2054-04-01" "2054-05-01" "2054-06-01" "2054-07-01" "2054-08-01" "2054-09-01"
 [610] "2054-10-01" "2054-11-01" "2054-12-01" "2055-01-01" "2055-02-01" "2055-03-01" "2055-04-01"
 [617] "2055-05-01" "2055-06-01" "2055-07-01" "2055-08-01" "2055-09-01" "2055-10-01" "2055-11-01"
 [624] "2055-12-01" "2056-01-01" "2056-02-01" "2056-03-01" "2056-04-01" "2056-05-01" "2056-06-01"
 [631] "2056-07-01" "2056-08-01" "2056-09-01" "2056-10-01" "2056-11-01" "2056-12-01" "2057-01-01"
 [638] "2057-02-01" "2057-03-01" "2057-04-01" "2057-05-01" "2057-06-01" "2057-07-01" "2057-08-01"
 [645] "2057-09-01" "2057-10-01" "2057-11-01" "2057-12-01" "2058-01-01" "2058-02-01" "2058-03-01"
 [652] "2058-04-01" "2058-05-01" "2058-06-01" "2058-07-01" "2058-08-01" "2058-09-01" "2058-10-01"
 [659] "2058-11-01" "2058-12-01" "2059-01-01" "2059-02-01" "2059-03-01" "2059-04-01" "2059-05-01"
 [666] "2059-06-01" "2059-07-01" "2059-08-01" "2059-09-01" "2059-10-01" "2059-11-01" "2059-12-01"
 [673] "2060-01-01" "2060-02-01" "2060-03-01" "2060-04-01" "2060-05-01" "2060-06-01" "2060-07-01"
 [680] "2060-08-01" "2060-09-01" "2060-10-01" "2060-11-01" "2060-12-01" "2061-01-01" "2061-02-01"
 [687] "2061-03-01" "2061-04-01" "2061-05-01" "2061-06-01" "2061-07-01" "2061-08-01" "2061-09-01"
 [694] "2061-10-01" "2061-11-01" "2061-12-01" "2062-01-01" "2062-02-01" "2062-03-01" "2062-04-01"
 [701] "2062-05-01" "2062-06-01" "2062-07-01" "2062-08-01" "2062-09-01" "2062-10-01" "2062-11-01"
 [708] "2062-12-01" "2063-01-01" "2063-02-01" "2063-03-01" "2063-04-01" "2063-05-01" "2063-06-01"
 [715] "2063-07-01" "2063-08-01" "2063-09-01" "2063-10-01" "2063-11-01" "2063-12-01" "2064-01-01"
 [722] "2064-02-01" "2064-03-01" "2064-04-01" "2064-05-01" "2064-06-01" "2064-07-01" "2064-08-01"
 [729] "2064-09-01" "2064-10-01" "2064-11-01" "2064-12-01" "2065-01-01" "2065-02-01" "2065-03-01"
 [736] "2065-04-01" "2065-05-01" "2065-06-01" "2065-07-01" "2065-08-01" "2065-09-01" "2065-10-01"
 [743] "2065-11-01" "2065-12-01" "2066-01-01" "2066-02-01" "2066-03-01" "2066-04-01" "2066-05-01"
 [750] "2066-06-01" "2066-07-01" "2066-08-01" "2066-09-01" "2066-10-01" "2066-11-01" "2066-12-01"
 [757] "2067-01-01" "2067-02-01" "2067-03-01" "2067-04-01" "2067-05-01" "2067-06-01" "2067-07-01"
 [764] "2067-08-01" "2067-09-01" "2067-10-01" "2067-11-01" "2067-12-01" "2068-01-01" "2068-02-01"
 [771] "2068-03-01" "2068-04-01" "2068-05-01" "2068-06-01" "2068-07-01" "2068-08-01" "2068-09-01"
 [778] "2068-10-01" "2068-11-01" "2068-12-01" "2069-01-01" "2069-02-01" "2069-03-01" "2069-04-01"
 [785] "2069-05-01" "2069-06-01" "2069-07-01" "2069-08-01" "2069-09-01" "2069-10-01" "2069-11-01"
 [792] "2069-12-01" "2070-01-01" "2070-02-01" "2070-03-01" "2070-04-01" "2070-05-01" "2070-06-01"
 [799] "2070-07-01" "2070-08-01" "2070-09-01" "2070-10-01" "2070-11-01" "2070-12-01" "2071-01-01"
 [806] "2071-02-01" "2071-03-01" "2071-04-01" "2071-05-01" "2071-06-01" "2071-07-01" "2071-08-01"
 [813] "2071-09-01" "2071-10-01" "2071-11-01" "2071-12-01" "2072-01-01" "2072-02-01" "2072-03-01"
 [820] "2072-04-01" "2072-05-01" "2072-06-01" "2072-07-01" "2072-08-01" "2072-09-01" "2072-10-01"
 [827] "2072-11-01" "2072-12-01" "2073-01-01" "2073-02-01" "2073-03-01" "2073-04-01" "2073-05-01"
 [834] "2073-06-01" "2073-07-01" "2073-08-01" "2073-09-01" "2073-10-01" "2073-11-01" "2073-12-01"
 [841] "2074-01-01" "2074-02-01" "2074-03-01" "2074-04-01" "2074-05-01" "2074-06-01" "2074-07-01"
 [848] "2074-08-01" "2074-09-01" "2074-10-01" "2074-11-01" "2074-12-01" "2075-01-01" "2075-02-01"
 [855] "2075-03-01" "2075-04-01" "2075-05-01" "2075-06-01" "2075-07-01" "2075-08-01" "2075-09-01"
 [862] "2075-10-01" "2075-11-01" "2075-12-01" "2076-01-01" "2076-02-01" "2076-03-01" "2076-04-01"
 [869] "2076-05-01" "2076-06-01" "2076-07-01" "2076-08-01" "2076-09-01" "2076-10-01" "2076-11-01"
 [876] "2076-12-01" "2077-01-01" "2077-02-01" "2077-03-01" "2077-04-01" "2077-05-01" "2077-06-01"
 [883] "2077-07-01" "2077-08-01" "2077-09-01" "2077-10-01" "2077-11-01" "2077-12-01" "2078-01-01"
 [890] "2078-02-01" "2078-03-01" "2078-04-01" "2078-05-01" "2078-06-01" "2078-07-01" "2078-08-01"
 [897] "2078-09-01" "2078-10-01" "2078-11-01" "2078-12-01" "2079-01-01" "2079-02-01" "2079-03-01"
 [904] "2079-04-01" "2079-05-01" "2079-06-01" "2079-07-01" "2079-08-01" "2079-09-01" "2079-10-01"
 [911] "2079-11-01" "2079-12-01" "2080-01-01" "2080-02-01" "2080-03-01" "2080-04-01" "2080-05-01"
 [918] "2080-06-01" "2080-07-01" "2080-08-01" "2080-09-01" "2080-10-01" "2080-11-01" "2080-12-01"
 [925] "2081-01-01" "2081-02-01" "2081-03-01" "2081-04-01" "2081-05-01" "2081-06-01" "2081-07-01"
 [932] "2081-08-01" "2081-09-01" "2081-10-01" "2081-11-01" "2081-12-01" "2082-01-01" "2082-02-01"
 [939] "2082-03-01" "2082-04-01" "2082-05-01" "2082-06-01" "2082-07-01" "2082-08-01" "2082-09-01"
 [946] "2082-10-01" "2082-11-01" "2082-12-01" "2083-01-01" "2083-02-01" "2083-03-01" "2083-04-01"
 [953] "2083-05-01" "2083-06-01" "2083-07-01" "2083-08-01" "2083-09-01" "2083-10-01" "2083-11-01"
 [960] "2083-12-01" "2084-01-01" "2084-02-01" "2084-03-01" "2084-04-01" "2084-05-01" "2084-06-01"
 [967] "2084-07-01" "2084-08-01" "2084-09-01" "2084-10-01" "2084-11-01" "2084-12-01" "2085-01-01"
 [974] "2085-02-01" "2085-03-01" "2085-04-01" "2085-05-01" "2085-06-01" "2085-07-01" "2085-08-01"
 [981] "2085-09-01" "2085-10-01" "2085-11-01" "2085-12-01" "2086-01-01" "2086-02-01" "2086-03-01"
 [988] "2086-04-01" "2086-05-01" "2086-06-01" "2086-07-01" "2086-08-01" "2086-09-01" "2086-10-01"
 [995] "2086-11-01" "2086-12-01" "2087-01-01" "2087-02-01" "2087-03-01" "2087-04-01"
 [ reached getOption("max.print") -- omitted 164 entries ]
time <-as.Date(time)
out <- as.matrix(YF45_out_response)         ## convert from coda to matrix

code from AMW for splitting up this matrix

x_cols <- grep('^x', colnames(out))
obs_cols <- grep('^OBS', colnames(out))

out_x <- out[,x_cols]
out_obs <- out[,obs_cols]

rm(out)

out_x <- t(out_x)

out_x <- as.data.frame(out_x)
out_x2 <- out_x |>
  tibble::rownames_to_column(var = 'time_pond') |>
  dplyr::mutate(timestep = sub(x = time_pond,
                               pattern = '.*x\\[',
                               replacement = ''),
                timestep = sub(x = timestep,
                               pattern = ',.*',
                               replacement = ''),
                pond = sub(x = time_pond,
                           pattern = '.*,',
                           replacement = ''),
                pond = sub(x = pond,
                           pattern = '\\]',
                           replacement = '')) |>
  tidyr::pivot_longer(-c(time_pond, timestep, pond),
                      names_to = 'iter', values_to = 'val') |>
  dplyr::group_by(pond, timestep) |>
  dplyr::summarize(low = quantile(val, probs = 0.025),
                   med = median(val),
                   high = quantile(val, probs = 0.975))
`summarise()` has grouped output by 'pond'. You can override using the `.groups` argument.
timesteps <- as.data.frame(time)
timesteps$ind <- as.character(seq(from = 1, to = nrow(timesteps), by = 1))
colnames(timesteps) <- c('time', 'timestep')

ponds <- as.data.frame(colnames(YF_WaterTemp45[-1]))
ponds$ind <- as.character(seq(from = 1, to = nrow(ponds), by = 1))
colnames(ponds) <- c('pond_name', 'pond')

out_x_mapped <- out_x2 |>
  dplyr::left_join(y = timesteps, by = 'timestep') |>
  dplyr::left_join(y = ponds, by = 'pond') |>
  dplyr::select(low, med, high, time, pond_name)
Adding missing grouping variables: `pond`
pX <- out_x_mapped |>
  ggplot2::ggplot() +
  ggplot2::geom_line(ggplot2::aes(x = time, y = med)) +
  ggplot2::geom_ribbon(ggplot2::aes(x = time, ymin = low, ymax = high)) +
  ggplot2::facet_wrap(~pond_name)

out_obs <- t(out_obs)

out_obs <- as.data.frame(out_obs)

out_obs2 <- out_obs |>
  tibble::rownames_to_column(var = 'time_pond') |>
  dplyr::mutate(timestep = sub(x = time_pond,
                               pattern = '.*OBS\\[',
                               replacement = ''),
                timestep = sub(x = timestep,
                               pattern = ',.*',
                               replacement = ''),
                pond = sub(x = time_pond,
                           pattern = '.*,',
                           replacement = ''),
                pond = sub(x = pond,
                           pattern = '\\]',
                           replacement = '')) |>
  tidyr::pivot_longer(-c(time_pond, timestep, pond),
                      names_to = 'iter', values_to = 'val') |>
  dplyr::group_by(pond, timestep) |>
  dplyr::summarize(low = quantile(val, probs = 0.025),
                   med = median(val),
                   high = quantile(val, probs = 0.975))
`summarise()` has grouped output by 'pond'. You can override using the `.groups` argument.
out_obs_mapped <- out_obs2 |>
  dplyr::left_join(y = timesteps, by = 'timestep') |>
  dplyr::left_join(y = ponds, by = 'pond') |>
  dplyr::select(low, med, high, time, pond_name)
Adding missing grouping variables: `pond`
pOBS <- out_obs_mapped |>
  ggplot2::ggplot() +
  ggplot2::geom_line(ggplot2::aes(x = time, y = med)) +
  ggplot2::geom_ribbon(ggplot2::aes(x = time, ymin = low, ymax = high)) +
  ggplot2::facet_wrap(~pond_name)

cowplot::plot_grid(pX, pOBS)

Probability of Crossing Threshold

threshold_probs <- out_obs |>
  tibble::rownames_to_column(var = 'time_pond') |>
  dplyr::mutate(timestep = sub(x = time_pond,
                               pattern = '.*OBS\\[',
                               replacement = ''),
                timestep = sub(x = timestep,
                               pattern = ',.*',
                               replacement = ''),
                pond = sub(x = time_pond,
                           pattern = '.*,',
                           replacement = ''),
                pond = sub(x = pond,
                           pattern = '\\]',
                           replacement = '')) |>
  tidyr::pivot_longer(-c(time_pond, timestep, pond),
                      names_to = 'iter', values_to = 'val') |>
  dplyr::group_by(pond, timestep) |>
  dplyr::summarize(n_iter = dplyr::n(),
                   n_thresh = sum(val > 20),
                   prob = (n_thresh / n_iter) * 100)
`summarise()` has grouped output by 'pond'. You can override using the `.groups` argument.
threshold_probs_mapped <- threshold_probs |>
  dplyr::left_join(y = timesteps, by = 'timestep') |>
  dplyr::left_join(y = ponds, by = 'pond')

threshold_probs_mapped |>
  ggplot2::ggplot() +
  ggplot2::geom_line(ggplot2::aes(x = time, y = prob)) +
  ggplot2::facet_wrap(~pond_name)

Save these ouputs using a .RDataFile type

save.image(file = "Corr_PooledMod_YF45.RData")

#Currently this has all the information in it. Eventually could limit this to be just the relavent information for the remaining code below

Making Graphs

Load in this file here as long as no code changes are needed above

load(file = "Corr_PooledMod_YF45.RData")

Creating some nice plots of these

  1. colored panel plot (each ponds forecast with the median, high, and low plus a trend line)
# set up the colors here for the plots below so that each pond has the same color each time
Mod_YF45 <- out_obs_mapped
str(Mod_YF45)
gropd_df [12,804 × 6] (S3: grouped_df/tbl_df/tbl/data.frame)
 $ pond     : chr [1:12804] "1" "1" "1" "1" ...
 $ low      : Named num [1:12804] -6.02 6.62 -1.38 1.07 4.39 ...
  ..- attr(*, "names")= chr [1:12804] "2.5%" "2.5%" "2.5%" "2.5%" ...
 $ med      : num [1:12804] 0.173 6.62 2.398 4.825 7.657 ...
 $ high     : Named num [1:12804] 6.4 6.62 5.98 8.39 10.77 ...
  ..- attr(*, "names")= chr [1:12804] "97.5%" "97.5%" "97.5%" "97.5%" ...
 $ time     : Date[1:12804], format: "2012-01-01" "2012-10-01" "2012-04-01" ...
 $ pond_name: chr [1:12804] "MP1" "MP1" "MP1" "MP1" ...
 - attr(*, "groups")= tibble [11 × 2] (S3: tbl_df/tbl/data.frame)
  ..$ pond : chr [1:11] "1" "10" "11" "2" ...
  ..$ .rows: list<int> [1:11] 
  .. ..$ : int [1:1164] 1 2 3 4 5 6 7 8 9 10 ...
  .. ..$ : int [1:1164] 1165 1166 1167 1168 1169 1170 1171 1172 1173 1174 ...
  .. ..$ : int [1:1164] 2329 2330 2331 2332 2333 2334 2335 2336 2337 2338 ...
  .. ..$ : int [1:1164] 3493 3494 3495 3496 3497 3498 3499 3500 3501 3502 ...
  .. ..$ : int [1:1164] 4657 4658 4659 4660 4661 4662 4663 4664 4665 4666 ...
  .. ..$ : int [1:1164] 5821 5822 5823 5824 5825 5826 5827 5828 5829 5830 ...
  .. ..$ : int [1:1164] 6985 6986 6987 6988 6989 6990 6991 6992 6993 6994 ...
  .. ..$ : int [1:1164] 8149 8150 8151 8152 8153 8154 8155 8156 8157 8158 ...
  .. ..$ : int [1:1164] 9313 9314 9315 9316 9317 9318 9319 9320 9321 9322 ...
  .. ..$ : int [1:1164] 10477 10478 10479 10480 10481 10482 10483 10484 10485 10486 ...
  .. ..$ : int [1:1164] 11641 11642 11643 11644 11645 11646 11647 11648 11649 11650 ...
  .. ..@ ptype: int(0) 
  ..- attr(*, ".drop")= logi TRUE
write.csv(Mod_YF45, "Mod_YF45.csv")

# Define the custom color palette
YF_colors <- c("#E41A1C", "#377EB8", "#4DAF4A", "#984EA3", "#FF7F00", "#FFFF33", "#A65628", "#F781BF", "lightblue", "lightgreen", "#6A3D9A")

# Ensure that YF_colors has the same length as the number of unique ponds
unique_ponds <- unique(Mod_YF45$pond_name)
if (length(YF_colors) != length(unique_ponds)) {
  stop("The number of colors in YF_colors does not match the number of unique ponds.")
}

# Create a named vector for YF_colors with pond names
color_mapping <- setNames(YF_colors, unique_ponds)

# Plotting
Ponds_YF45 <- ggplot(data = Mod_YF45, aes(x = time)) +
  geom_ribbon(aes(ymin = low, ymax = high, fill = pond_name)) +  # Add the ribbon with colors
  geom_line(aes(y = med, color = pond_name)) +  # Ensure lines are visible and colored by pond
  geom_smooth(aes(y = med, color = "grey"), size = 1) +  # Ensure lines are visible and colored by pond
  geom_vline(xintercept = as.Date("2020-12-01"), linetype = "dashed", color = "red") +  # Add vertical dashed red line
  facet_wrap(~ pond_name) +  # Facet by pond_name
  scale_color_manual(values = color_mapping) +  # Use custom colors for lines
  scale_fill_manual(values = color_mapping) +   # Use custom colors for ribbons
  xlab("Year") +
  ylab("Water Temperature (°C)") +
  theme_classic() +
  theme(plot.title = element_text(hjust = 0.5, size = 24),
        axis.title = element_text(size = 22),
        axis.text = element_text(size = 20),
        axis.text.x = element_text(angle = 45, hjust = 1),
        legend.position = "none",
        strip.text = element_text(size = 16))
Ponds_YF45
`geom_smooth()` using method = 'gam' and formula = 'y ~ s(x, bs = "cs")'
ggsave("Corr_IndPonds_YF45.png", plot = Ponds_YF45, width = 8, height = 6)
`geom_smooth()` using method = 'gam' and formula = 'y ~ s(x, bs = "cs")'

  1. Trend by pond (geom smooth for each pond on the same plot for comparison)
# using the same aestetics as above

Trends_YF45 <- ggplot(data = Mod_YF45, aes(x = time)) +
  geom_smooth(aes(y = med, color = pond_name, fill = pond_name), alpha = 0.15, size = 1) +  # Smooth lines with colors by pond_name
  scale_color_manual(values = color_mapping) +
  scale_fill_manual(values = color_mapping) +   # Use custom colors for ribbons
  labs(
       x = "Year",
       y = "Water Temperature (°C)",
       color = "Pond Name",
       fill = "Pond Name") +  # Labels for legend
  theme_classic() +
  theme(plot.title = element_text(hjust = 0.5, size = 18),
        axis.title = element_text(size = 22),
        axis.text = element_text(size = 20),
        legend.position = "right",
        legend.text = element_text(size = 16), # Change the legend text size here
        legend.title = element_text(size = 20))
Trends_YF45
`geom_smooth()` using method = 'gam' and formula = 'y ~ s(x, bs = "cs")'
ggsave("Corr_IndTrends_YF45.png", plot = Trends_YF45, width = 9, height = 6)
`geom_smooth()` using method = 'gam' and formula = 'y ~ s(x, bs = "cs")'

  1. probability plot (by pond)
probs_YF45 <- threshold_probs_mapped
write.csv(probs_YF45, "probs_YF45.csv")

Probs20_YF45 <- ggplot(data = probs_YF45, aes(x = time)) +
  geom_line(aes(y = prob, color = pond_name)) +  # Ensure lines are visible and colored by pond
  facet_wrap(~ pond_name) +  # Facet by pond_name
  scale_color_manual(values = color_mapping) +  # Use custom colors for lines
  xlab("Year") +
  ylab("Probability") +
  xlim(as.Date(c("2020-12-01", "2099-12-01"))) +
  ylim(0,50) +
  theme_classic() +
  theme(plot.title = element_text(hjust = 0.5, size = 24),
        axis.title = element_text(size = 22),
        axis.text = element_text(size = 20),
        axis.text.x = element_text(angle = 45, hjust = 1),
        legend.position = "none",
        strip.text = element_text(size = 16))
Probs20_YF45
Warning: Removed 2365 rows containing missing values or values outside the scale range (`geom_line()`).
ggsave("Corr_Probs20_YF45.png", plot = Probs20_YF45, width = 10, height = 6)
Warning: Removed 2365 rows containing missing values or values outside the scale range (`geom_line()`).

  1. Model fits by pond
Mod_YF45

ModObs <- Mod_YF45 %>%
  filter(time < "2021-01-01")
range(ModObs$time)
[1] "2012-01-01" "2020-12-01"
ErrorPlot_YF45 <- ggplot(data = ModObs, aes(x = time)) +
  geom_ribbon(aes(ymin = low, ymax = high, fill = pond_name)) +  # Adjust fill colors
  geom_line(aes(y = med), color = "black") +  # Black lines for the median values
  facet_wrap(~ pond_name) +  # Facet by pond_name
  scale_fill_manual(values = color_mapping) +  # Apply custom color palette for ribbons
  labs(
       x = "Year",
       y = "Water Temperature (°C)",
       color = "Pond Name",
       fill = "Pond Name") +  # Labels for legend
  theme_classic() +
  theme(
    plot.title = element_text(hjust = 0.5),
    axis.title = element_text(size = 22),
    axis.text = element_text(size = 20),
    axis.text.x = element_text(angle = 45, hjust = 1),
    legend.position = "none" # Angle x-axis labels if needed
  )
ErrorPlot_YF45

ggsave("Corr_Error_YF45.png", plot = ErrorPlot_YF45, width = 9, height = 6)

Clear out the environment and reload the basics before starting the next section

rm(list = ls())

library(tidyverse)
library(rjags)
library(ggplot2)

set.seed(1)

RCP 8.5

Design the Model

Read in the data here, which is an output of XX code file

Then separate the data into air and water temperature files

# Air and water temperature data: YF loccation, 4.5 scenario
YF_Temps <- read.csv("YF_85SNAPForecast.csv", header=TRUE)

# Air temperature variables
YF_AirTemp85 <- YF_Temps %>%
  select(date, Airport, Air_MonthAvg, std, precision, Region)

# Water temperature variables
YF_WaterTemp85 <- YF_Temps %>%
  select(date, MP1, MP3, MP5, MP8, PL1, PL2, PL3, UBP1, UBP2, UBP3, UBP4)


# Set up a string of all the dates
time <- YF_WaterTemp85$date
length(time)
[1] 1164

Setting up the random walk model

dlm_pooled <- "
model{
#### Priors
for(p in 1:np){
x[1,p] ~ dnorm(x_ic, tau_ic) # Initial condition of water temperature
}
tau_obs ~ dgamma(a_obs, r_obs) # Prior on observation error
tau_add ~ dgamma(a_add, r_add) # Prior on process error

#### Fixed Effects
beta ~ dmnorm(mu_beta, tau_beta) # Prior on beta coefficients

for(p in 1:np){
int[p] ~ dnorm(mu_int, tau_int) # Prior on pond-specific intercepts
}

#### Data Model
for(t in 1:n){ # loop over all time steps
for(p in 1:np){
OBS[t,p] ~ dnorm(x[t,p], tau_obs) # Observed water temperature is drawn from latent air temperature with observation uncertainty
}
Xf[t] ~ dnorm(muAirTemp[t], tauAirTemp[t]) # Latent air temperature is drawn from mean and precision of forecasated air temperature
}

#### Process Model
for(t in 2:n){ # loop over all time steps except teh first (we defined ic above)
for(p in 1:np){
mu[t,p] <- x[t-1,p] + int[p] + beta[1] * x[t-1,p] + beta[2] * Xf[t] # Mean water temperature is a function of the previous time step and current air temperature
x[t,p] ~ dnorm(mu[t,p], tau_add) # Latent water temperature is drawn from mean water temperature with process uncertainty
}
}
}
"

Define the data and priors for the model

# Empty list
data <- list()
# Water temperature observations
data$OBS <- dplyr::select(YF_WaterTemp85, -date)
# Number of time steps
data$n <- nrow(data$OBS)
# Number of ponds
data$np <- ncol(data$OBS)
# Initial water temperature mean
data$x_ic <- 0.1
# Initial water temperature precision
data$tau_ic = 0.1
# Prior parameters for observation and process uncertainty
data$a_obs = 1
data$r_obs = 1
data$a_add = 1
data$r_add = 1
# Prior parameters for beta coefficients
data$mu_beta <- c(0, 0)
data$tau_beta <- diag(x = c(0.001, 0.001), nrow = 2, ncol = 2)
# Prior parameters for intercept
data$mu_int <- 0
data$tau_int <- 0.001
# Mean air temperature estimate
data$muAirTemp <- YF_AirTemp85$Air_MonthAvg
# Air temperature precision
data$tauAirTemp <- YF_AirTemp85$precision

Create JAGS model with 3 chains

jm <- jags.model(file = textConnection(dlm_pooled), data = data, n.chains = 3)
Compiling model graph
   Resolving undeclared variables
   Allocating nodes
Graph information:
   Observed stochastic nodes: 456
   Unobserved stochastic nodes: 26330
   Total graph size: 55883

Initializing model

Posterior samples of parameters

YF85_out_params <- coda.samples(model = jm,
                               variable.names = c('beta', 'int',
                                                  'tau_add', 'tau_obs'),
                               n.iter = 50000, thin = 25)

  |                                                        
  |                                                  |   0%
  |                                                        
  |*                                                 |   2%
  |                                                        
  |**                                                |   4%
  |                                                        
  |***                                               |   6%
  |                                                        
  |****                                              |   8%
  |                                                        
  |*****                                             |  10%
  |                                                        
  |******                                            |  12%
  |                                                        
  |*******                                           |  14%
  |                                                        
  |********                                          |  16%
  |                                                        
  |*********                                         |  18%
  |                                                        
  |**********                                        |  20%
  |                                                        
  |***********                                       |  22%
  |                                                        
  |************                                      |  24%
  |                                                        
  |*************                                     |  26%
  |                                                        
  |**************                                    |  28%
  |                                                        
  |***************                                   |  30%
  |                                                        
  |****************                                  |  32%
  |                                                        
  |*****************                                 |  34%
  |                                                        
  |******************                                |  36%
  |                                                        
  |*******************                               |  38%
  |                                                        
  |********************                              |  40%
  |                                                        
  |*********************                             |  42%
  |                                                        
  |**********************                            |  44%
  |                                                        
  |***********************                           |  46%
  |                                                        
  |************************                          |  48%
  |                                                        
  |*************************                         |  50%
  |                                                        
  |**************************                        |  52%
  |                                                        
  |***************************                       |  54%
  |                                                        
  |****************************                      |  56%
  |                                                        
  |*****************************                     |  58%
  |                                                        
  |******************************                    |  60%
  |                                                        
  |*******************************                   |  62%
  |                                                        
  |********************************                  |  64%
  |                                                        
  |*********************************                 |  66%
  |                                                        
  |**********************************                |  68%
  |                                                        
  |***********************************               |  70%
  |                                                        
  |************************************              |  72%
  |                                                        
  |*************************************             |  74%
  |                                                        
  |**************************************            |  76%
  |                                                        
  |***************************************           |  78%
  |                                                        
  |****************************************          |  80%
  |                                                        
  |*****************************************         |  82%
  |                                                        
  |******************************************        |  84%
  |                                                        
  |*******************************************       |  86%
  |                                                        
  |********************************************      |  88%
  |                                                        
  |*********************************************     |  90%
  |                                                        
  |**********************************************    |  92%
  |                                                        
  |***********************************************   |  94%
  |                                                        
  |************************************************  |  96%
  |                                                        
  |************************************************* |  98%
  |                                                        
  |**************************************************| 100%

Posterior samples of response variables

YF85_out_response <- coda.samples(model = jm,
                                 variable.names = c('x', 'OBS'),
                                 n.iter = 100000, thin = 25)

  |                                                        
  |                                                  |   0%
  |                                                        
  |*                                                 |   2%
  |                                                        
  |**                                                |   4%
  |                                                        
  |***                                               |   6%
  |                                                        
  |****                                              |   8%
  |                                                        
  |*****                                             |  10%
  |                                                        
  |******                                            |  12%
  |                                                        
  |*******                                           |  14%
  |                                                        
  |********                                          |  16%
  |                                                        
  |*********                                         |  18%
  |                                                        
  |**********                                        |  20%
  |                                                        
  |***********                                       |  22%
  |                                                        
  |************                                      |  24%
  |                                                        
  |*************                                     |  26%
  |                                                        
  |**************                                    |  28%
  |                                                        
  |***************                                   |  30%
  |                                                        
  |****************                                  |  32%
  |                                                        
  |*****************                                 |  34%
  |                                                        
  |******************                                |  36%
  |                                                        
  |*******************                               |  38%
  |                                                        
  |********************                              |  40%
  |                                                        
  |*********************                             |  42%
  |                                                        
  |**********************                            |  44%
  |                                                        
  |***********************                           |  46%
  |                                                        
  |************************                          |  48%
  |                                                        
  |*************************                         |  50%
  |                                                        
  |**************************                        |  52%
  |                                                        
  |***************************                       |  54%
  |                                                        
  |****************************                      |  56%
  |                                                        
  |*****************************                     |  58%
  |                                                        
  |******************************                    |  60%
  |                                                        
  |*******************************                   |  62%
  |                                                        
  |********************************                  |  64%
  |                                                        
  |*********************************                 |  66%
  |                                                        
  |**********************************                |  68%
  |                                                        
  |***********************************               |  70%
  |                                                        
  |************************************              |  72%
  |                                                        
  |*************************************             |  74%
  |                                                        
  |**************************************            |  76%
  |                                                        
  |***************************************           |  78%
  |                                                        
  |****************************************          |  80%
  |                                                        
  |*****************************************         |  82%
  |                                                        
  |******************************************        |  84%
  |                                                        
  |*******************************************       |  86%
  |                                                        
  |********************************************      |  88%
  |                                                        
  |*********************************************     |  90%
  |                                                        
  |**********************************************    |  92%
  |                                                        
  |***********************************************   |  94%
  |                                                        
  |************************************************  |  96%
  |                                                        
  |************************************************* |  98%
  |                                                        
  |**************************************************| 100%

A couple quick checks here

# plot(YF85_out_params)
gelman.diag(YF85_out_params, confidence = 0.99)
Potential scale reduction factors:

        Point est. Upper C.I.
beta[1]       1.00       1.01
beta[2]       1.00       1.01
int[1]        1.01       1.03
int[2]        1.01       1.05
int[3]        1.01       1.04
int[4]        1.01       1.04
int[5]        1.01       1.04
int[6]        1.01       1.05
int[7]        1.01       1.05
int[8]        1.01       1.04
int[9]        1.01       1.05
int[10]       1.01       1.05
int[11]       1.01       1.04
tau_add       1.00       1.00
tau_obs       1.00       1.00

Multivariate psrf

1.01

Visualize the output by just looking at the 95% Credible interval of the time-series of X’s and compare that to the observed Y’s

Transform the samples back from the log domain to the linear domain

time                               ## adjust to zoom in and out
   [1] "2012-01-01" "2012-02-01" "2012-03-01" "2012-04-01" "2012-05-01" "2012-06-01" "2012-07-01"
   [8] "2012-08-01" "2012-09-01" "2012-10-01" "2012-11-01" "2012-12-01" "2013-01-01" "2013-02-01"
  [15] "2013-03-01" "2013-04-01" "2013-05-01" "2013-06-01" "2013-07-01" "2013-08-01" "2013-09-01"
  [22] "2013-10-01" "2013-11-01" "2013-12-01" "2014-01-01" "2014-02-01" "2014-03-01" "2014-04-01"
  [29] "2014-05-01" "2014-06-01" "2014-07-01" "2014-08-01" "2014-09-01" "2014-10-01" "2014-11-01"
  [36] "2014-12-01" "2015-01-01" "2015-02-01" "2015-03-01" "2015-04-01" "2015-05-01" "2015-06-01"
  [43] "2015-07-01" "2015-08-01" "2015-09-01" "2015-10-01" "2015-11-01" "2015-12-01" "2016-01-01"
  [50] "2016-02-01" "2016-03-01" "2016-04-01" "2016-05-01" "2016-06-01" "2016-07-01" "2016-08-01"
  [57] "2016-09-01" "2016-10-01" "2016-11-01" "2016-12-01" "2017-01-01" "2017-02-01" "2017-03-01"
  [64] "2017-04-01" "2017-05-01" "2017-06-01" "2017-07-01" "2017-08-01" "2017-09-01" "2017-10-01"
  [71] "2017-11-01" "2017-12-01" "2018-01-01" "2018-02-01" "2018-03-01" "2018-04-01" "2018-05-01"
  [78] "2018-06-01" "2018-07-01" "2018-08-01" "2018-09-01" "2018-10-01" "2018-11-01" "2018-12-01"
  [85] "2019-01-01" "2019-02-01" "2019-03-01" "2019-04-01" "2019-05-01" "2019-06-01" "2019-07-01"
  [92] "2019-08-01" "2019-09-01" "2019-10-01" "2019-11-01" "2019-12-01" "2012-01-01" "2012-02-01"
  [99] "2012-03-01" "2012-04-01" "2012-05-01" "2012-06-01" "2012-07-01" "2012-08-01" "2012-09-01"
 [106] "2012-10-01" "2012-11-01" "2012-12-01" "2013-01-01" "2013-02-01" "2013-03-01" "2013-04-01"
 [113] "2013-05-01" "2013-06-01" "2013-07-01" "2013-08-01" "2013-09-01" "2013-10-01" "2013-11-01"
 [120] "2013-12-01" "2014-01-01" "2014-02-01" "2014-03-01" "2014-04-01" "2014-05-01" "2014-06-01"
 [127] "2014-07-01" "2014-08-01" "2014-09-01" "2014-10-01" "2014-11-01" "2014-12-01" "2015-01-01"
 [134] "2015-02-01" "2015-03-01" "2015-04-01" "2015-05-01" "2015-06-01" "2015-07-01" "2015-08-01"
 [141] "2015-09-01" "2015-10-01" "2015-11-01" "2015-12-01" "2016-01-01" "2016-02-01" "2016-03-01"
 [148] "2016-04-01" "2016-05-01" "2016-06-01" "2016-07-01" "2016-08-01" "2016-09-01" "2016-10-01"
 [155] "2016-11-01" "2016-12-01" "2017-01-01" "2017-02-01" "2017-03-01" "2017-04-01" "2017-05-01"
 [162] "2017-06-01" "2017-07-01" "2017-08-01" "2017-09-01" "2017-10-01" "2017-11-01" "2017-12-01"
 [169] "2018-01-01" "2018-02-01" "2018-03-01" "2018-04-01" "2018-05-01" "2018-06-01" "2018-07-01"
 [176] "2018-08-01" "2018-09-01" "2018-10-01" "2018-11-01" "2018-12-01" "2019-01-01" "2019-02-01"
 [183] "2019-03-01" "2019-04-01" "2019-05-01" "2019-06-01" "2019-07-01" "2019-08-01" "2019-09-01"
 [190] "2019-10-01" "2019-11-01" "2019-12-01" "2020-01-01" "2020-02-01" "2020-03-01" "2020-04-01"
 [197] "2020-05-01" "2020-06-01" "2020-07-01" "2020-08-01" "2020-09-01" "2020-10-01" "2020-11-01"
 [204] "2020-12-01" "2021-01-01" "2021-02-01" "2021-03-01" "2021-04-01" "2021-05-01" "2021-06-01"
 [211] "2021-07-01" "2021-08-01" "2021-09-01" "2021-10-01" "2021-11-01" "2021-12-01" "2022-01-01"
 [218] "2022-02-01" "2022-03-01" "2022-04-01" "2022-05-01" "2022-06-01" "2022-07-01" "2022-08-01"
 [225] "2022-09-01" "2022-10-01" "2022-11-01" "2022-12-01" "2023-01-01" "2023-02-01" "2023-03-01"
 [232] "2023-04-01" "2023-05-01" "2023-06-01" "2023-07-01" "2023-08-01" "2023-09-01" "2023-10-01"
 [239] "2023-11-01" "2023-12-01" "2024-01-01" "2024-02-01" "2024-03-01" "2024-04-01" "2024-05-01"
 [246] "2024-06-01" "2024-07-01" "2024-08-01" "2024-09-01" "2024-10-01" "2024-11-01" "2024-12-01"
 [253] "2025-01-01" "2025-02-01" "2025-03-01" "2025-04-01" "2025-05-01" "2025-06-01" "2025-07-01"
 [260] "2025-08-01" "2025-09-01" "2025-10-01" "2025-11-01" "2025-12-01" "2026-01-01" "2026-02-01"
 [267] "2026-03-01" "2026-04-01" "2026-05-01" "2026-06-01" "2026-07-01" "2026-08-01" "2026-09-01"
 [274] "2026-10-01" "2026-11-01" "2026-12-01" "2027-01-01" "2027-02-01" "2027-03-01" "2027-04-01"
 [281] "2027-05-01" "2027-06-01" "2027-07-01" "2027-08-01" "2027-09-01" "2027-10-01" "2027-11-01"
 [288] "2027-12-01" "2028-01-01" "2028-02-01" "2028-03-01" "2028-04-01" "2028-05-01" "2028-06-01"
 [295] "2028-07-01" "2028-08-01" "2028-09-01" "2028-10-01" "2028-11-01" "2028-12-01" "2029-01-01"
 [302] "2029-02-01" "2029-03-01" "2029-04-01" "2029-05-01" "2029-06-01" "2029-07-01" "2029-08-01"
 [309] "2029-09-01" "2029-10-01" "2029-11-01" "2029-12-01" "2030-01-01" "2030-02-01" "2030-03-01"
 [316] "2030-04-01" "2030-05-01" "2030-06-01" "2030-07-01" "2030-08-01" "2030-09-01" "2030-10-01"
 [323] "2030-11-01" "2030-12-01" "2031-01-01" "2031-02-01" "2031-03-01" "2031-04-01" "2031-05-01"
 [330] "2031-06-01" "2031-07-01" "2031-08-01" "2031-09-01" "2031-10-01" "2031-11-01" "2031-12-01"
 [337] "2032-01-01" "2032-02-01" "2032-03-01" "2032-04-01" "2032-05-01" "2032-06-01" "2032-07-01"
 [344] "2032-08-01" "2032-09-01" "2032-10-01" "2032-11-01" "2032-12-01" "2033-01-01" "2033-02-01"
 [351] "2033-03-01" "2033-04-01" "2033-05-01" "2033-06-01" "2033-07-01" "2033-08-01" "2033-09-01"
 [358] "2033-10-01" "2033-11-01" "2033-12-01" "2034-01-01" "2034-02-01" "2034-03-01" "2034-04-01"
 [365] "2034-05-01" "2034-06-01" "2034-07-01" "2034-08-01" "2034-09-01" "2034-10-01" "2034-11-01"
 [372] "2034-12-01" "2035-01-01" "2035-02-01" "2035-03-01" "2035-04-01" "2035-05-01" "2035-06-01"
 [379] "2035-07-01" "2035-08-01" "2035-09-01" "2035-10-01" "2035-11-01" "2035-12-01" "2036-01-01"
 [386] "2036-02-01" "2036-03-01" "2036-04-01" "2036-05-01" "2036-06-01" "2036-07-01" "2036-08-01"
 [393] "2036-09-01" "2036-10-01" "2036-11-01" "2036-12-01" "2037-01-01" "2037-02-01" "2037-03-01"
 [400] "2037-04-01" "2037-05-01" "2037-06-01" "2037-07-01" "2037-08-01" "2037-09-01" "2037-10-01"
 [407] "2037-11-01" "2037-12-01" "2038-01-01" "2038-02-01" "2038-03-01" "2038-04-01" "2038-05-01"
 [414] "2038-06-01" "2038-07-01" "2038-08-01" "2038-09-01" "2038-10-01" "2038-11-01" "2038-12-01"
 [421] "2039-01-01" "2039-02-01" "2039-03-01" "2039-04-01" "2039-05-01" "2039-06-01" "2039-07-01"
 [428] "2039-08-01" "2039-09-01" "2039-10-01" "2039-11-01" "2039-12-01" "2040-01-01" "2040-02-01"
 [435] "2040-03-01" "2040-04-01" "2040-05-01" "2040-06-01" "2040-07-01" "2040-08-01" "2040-09-01"
 [442] "2040-10-01" "2040-11-01" "2040-12-01" "2041-01-01" "2041-02-01" "2041-03-01" "2041-04-01"
 [449] "2041-05-01" "2041-06-01" "2041-07-01" "2041-08-01" "2041-09-01" "2041-10-01" "2041-11-01"
 [456] "2041-12-01" "2042-01-01" "2042-02-01" "2042-03-01" "2042-04-01" "2042-05-01" "2042-06-01"
 [463] "2042-07-01" "2042-08-01" "2042-09-01" "2042-10-01" "2042-11-01" "2042-12-01" "2043-01-01"
 [470] "2043-02-01" "2043-03-01" "2043-04-01" "2043-05-01" "2043-06-01" "2043-07-01" "2043-08-01"
 [477] "2043-09-01" "2043-10-01" "2043-11-01" "2043-12-01" "2044-01-01" "2044-02-01" "2044-03-01"
 [484] "2044-04-01" "2044-05-01" "2044-06-01" "2044-07-01" "2044-08-01" "2044-09-01" "2044-10-01"
 [491] "2044-11-01" "2044-12-01" "2045-01-01" "2045-02-01" "2045-03-01" "2045-04-01" "2045-05-01"
 [498] "2045-06-01" "2045-07-01" "2045-08-01" "2045-09-01" "2045-10-01" "2045-11-01" "2045-12-01"
 [505] "2046-01-01" "2046-02-01" "2046-03-01" "2046-04-01" "2046-05-01" "2046-06-01" "2046-07-01"
 [512] "2046-08-01" "2046-09-01" "2046-10-01" "2046-11-01" "2046-12-01" "2047-01-01" "2047-02-01"
 [519] "2047-03-01" "2047-04-01" "2047-05-01" "2047-06-01" "2047-07-01" "2047-08-01" "2047-09-01"
 [526] "2047-10-01" "2047-11-01" "2047-12-01" "2048-01-01" "2048-02-01" "2048-03-01" "2048-04-01"
 [533] "2048-05-01" "2048-06-01" "2048-07-01" "2048-08-01" "2048-09-01" "2048-10-01" "2048-11-01"
 [540] "2048-12-01" "2049-01-01" "2049-02-01" "2049-03-01" "2049-04-01" "2049-05-01" "2049-06-01"
 [547] "2049-07-01" "2049-08-01" "2049-09-01" "2049-10-01" "2049-11-01" "2049-12-01" "2050-01-01"
 [554] "2050-02-01" "2050-03-01" "2050-04-01" "2050-05-01" "2050-06-01" "2050-07-01" "2050-08-01"
 [561] "2050-09-01" "2050-10-01" "2050-11-01" "2050-12-01" "2051-01-01" "2051-02-01" "2051-03-01"
 [568] "2051-04-01" "2051-05-01" "2051-06-01" "2051-07-01" "2051-08-01" "2051-09-01" "2051-10-01"
 [575] "2051-11-01" "2051-12-01" "2052-01-01" "2052-02-01" "2052-03-01" "2052-04-01" "2052-05-01"
 [582] "2052-06-01" "2052-07-01" "2052-08-01" "2052-09-01" "2052-10-01" "2052-11-01" "2052-12-01"
 [589] "2053-01-01" "2053-02-01" "2053-03-01" "2053-04-01" "2053-05-01" "2053-06-01" "2053-07-01"
 [596] "2053-08-01" "2053-09-01" "2053-10-01" "2053-11-01" "2053-12-01" "2054-01-01" "2054-02-01"
 [603] "2054-03-01" "2054-04-01" "2054-05-01" "2054-06-01" "2054-07-01" "2054-08-01" "2054-09-01"
 [610] "2054-10-01" "2054-11-01" "2054-12-01" "2055-01-01" "2055-02-01" "2055-03-01" "2055-04-01"
 [617] "2055-05-01" "2055-06-01" "2055-07-01" "2055-08-01" "2055-09-01" "2055-10-01" "2055-11-01"
 [624] "2055-12-01" "2056-01-01" "2056-02-01" "2056-03-01" "2056-04-01" "2056-05-01" "2056-06-01"
 [631] "2056-07-01" "2056-08-01" "2056-09-01" "2056-10-01" "2056-11-01" "2056-12-01" "2057-01-01"
 [638] "2057-02-01" "2057-03-01" "2057-04-01" "2057-05-01" "2057-06-01" "2057-07-01" "2057-08-01"
 [645] "2057-09-01" "2057-10-01" "2057-11-01" "2057-12-01" "2058-01-01" "2058-02-01" "2058-03-01"
 [652] "2058-04-01" "2058-05-01" "2058-06-01" "2058-07-01" "2058-08-01" "2058-09-01" "2058-10-01"
 [659] "2058-11-01" "2058-12-01" "2059-01-01" "2059-02-01" "2059-03-01" "2059-04-01" "2059-05-01"
 [666] "2059-06-01" "2059-07-01" "2059-08-01" "2059-09-01" "2059-10-01" "2059-11-01" "2059-12-01"
 [673] "2060-01-01" "2060-02-01" "2060-03-01" "2060-04-01" "2060-05-01" "2060-06-01" "2060-07-01"
 [680] "2060-08-01" "2060-09-01" "2060-10-01" "2060-11-01" "2060-12-01" "2061-01-01" "2061-02-01"
 [687] "2061-03-01" "2061-04-01" "2061-05-01" "2061-06-01" "2061-07-01" "2061-08-01" "2061-09-01"
 [694] "2061-10-01" "2061-11-01" "2061-12-01" "2062-01-01" "2062-02-01" "2062-03-01" "2062-04-01"
 [701] "2062-05-01" "2062-06-01" "2062-07-01" "2062-08-01" "2062-09-01" "2062-10-01" "2062-11-01"
 [708] "2062-12-01" "2063-01-01" "2063-02-01" "2063-03-01" "2063-04-01" "2063-05-01" "2063-06-01"
 [715] "2063-07-01" "2063-08-01" "2063-09-01" "2063-10-01" "2063-11-01" "2063-12-01" "2064-01-01"
 [722] "2064-02-01" "2064-03-01" "2064-04-01" "2064-05-01" "2064-06-01" "2064-07-01" "2064-08-01"
 [729] "2064-09-01" "2064-10-01" "2064-11-01" "2064-12-01" "2065-01-01" "2065-02-01" "2065-03-01"
 [736] "2065-04-01" "2065-05-01" "2065-06-01" "2065-07-01" "2065-08-01" "2065-09-01" "2065-10-01"
 [743] "2065-11-01" "2065-12-01" "2066-01-01" "2066-02-01" "2066-03-01" "2066-04-01" "2066-05-01"
 [750] "2066-06-01" "2066-07-01" "2066-08-01" "2066-09-01" "2066-10-01" "2066-11-01" "2066-12-01"
 [757] "2067-01-01" "2067-02-01" "2067-03-01" "2067-04-01" "2067-05-01" "2067-06-01" "2067-07-01"
 [764] "2067-08-01" "2067-09-01" "2067-10-01" "2067-11-01" "2067-12-01" "2068-01-01" "2068-02-01"
 [771] "2068-03-01" "2068-04-01" "2068-05-01" "2068-06-01" "2068-07-01" "2068-08-01" "2068-09-01"
 [778] "2068-10-01" "2068-11-01" "2068-12-01" "2069-01-01" "2069-02-01" "2069-03-01" "2069-04-01"
 [785] "2069-05-01" "2069-06-01" "2069-07-01" "2069-08-01" "2069-09-01" "2069-10-01" "2069-11-01"
 [792] "2069-12-01" "2070-01-01" "2070-02-01" "2070-03-01" "2070-04-01" "2070-05-01" "2070-06-01"
 [799] "2070-07-01" "2070-08-01" "2070-09-01" "2070-10-01" "2070-11-01" "2070-12-01" "2071-01-01"
 [806] "2071-02-01" "2071-03-01" "2071-04-01" "2071-05-01" "2071-06-01" "2071-07-01" "2071-08-01"
 [813] "2071-09-01" "2071-10-01" "2071-11-01" "2071-12-01" "2072-01-01" "2072-02-01" "2072-03-01"
 [820] "2072-04-01" "2072-05-01" "2072-06-01" "2072-07-01" "2072-08-01" "2072-09-01" "2072-10-01"
 [827] "2072-11-01" "2072-12-01" "2073-01-01" "2073-02-01" "2073-03-01" "2073-04-01" "2073-05-01"
 [834] "2073-06-01" "2073-07-01" "2073-08-01" "2073-09-01" "2073-10-01" "2073-11-01" "2073-12-01"
 [841] "2074-01-01" "2074-02-01" "2074-03-01" "2074-04-01" "2074-05-01" "2074-06-01" "2074-07-01"
 [848] "2074-08-01" "2074-09-01" "2074-10-01" "2074-11-01" "2074-12-01" "2075-01-01" "2075-02-01"
 [855] "2075-03-01" "2075-04-01" "2075-05-01" "2075-06-01" "2075-07-01" "2075-08-01" "2075-09-01"
 [862] "2075-10-01" "2075-11-01" "2075-12-01" "2076-01-01" "2076-02-01" "2076-03-01" "2076-04-01"
 [869] "2076-05-01" "2076-06-01" "2076-07-01" "2076-08-01" "2076-09-01" "2076-10-01" "2076-11-01"
 [876] "2076-12-01" "2077-01-01" "2077-02-01" "2077-03-01" "2077-04-01" "2077-05-01" "2077-06-01"
 [883] "2077-07-01" "2077-08-01" "2077-09-01" "2077-10-01" "2077-11-01" "2077-12-01" "2078-01-01"
 [890] "2078-02-01" "2078-03-01" "2078-04-01" "2078-05-01" "2078-06-01" "2078-07-01" "2078-08-01"
 [897] "2078-09-01" "2078-10-01" "2078-11-01" "2078-12-01" "2079-01-01" "2079-02-01" "2079-03-01"
 [904] "2079-04-01" "2079-05-01" "2079-06-01" "2079-07-01" "2079-08-01" "2079-09-01" "2079-10-01"
 [911] "2079-11-01" "2079-12-01" "2080-01-01" "2080-02-01" "2080-03-01" "2080-04-01" "2080-05-01"
 [918] "2080-06-01" "2080-07-01" "2080-08-01" "2080-09-01" "2080-10-01" "2080-11-01" "2080-12-01"
 [925] "2081-01-01" "2081-02-01" "2081-03-01" "2081-04-01" "2081-05-01" "2081-06-01" "2081-07-01"
 [932] "2081-08-01" "2081-09-01" "2081-10-01" "2081-11-01" "2081-12-01" "2082-01-01" "2082-02-01"
 [939] "2082-03-01" "2082-04-01" "2082-05-01" "2082-06-01" "2082-07-01" "2082-08-01" "2082-09-01"
 [946] "2082-10-01" "2082-11-01" "2082-12-01" "2083-01-01" "2083-02-01" "2083-03-01" "2083-04-01"
 [953] "2083-05-01" "2083-06-01" "2083-07-01" "2083-08-01" "2083-09-01" "2083-10-01" "2083-11-01"
 [960] "2083-12-01" "2084-01-01" "2084-02-01" "2084-03-01" "2084-04-01" "2084-05-01" "2084-06-01"
 [967] "2084-07-01" "2084-08-01" "2084-09-01" "2084-10-01" "2084-11-01" "2084-12-01" "2085-01-01"
 [974] "2085-02-01" "2085-03-01" "2085-04-01" "2085-05-01" "2085-06-01" "2085-07-01" "2085-08-01"
 [981] "2085-09-01" "2085-10-01" "2085-11-01" "2085-12-01" "2086-01-01" "2086-02-01" "2086-03-01"
 [988] "2086-04-01" "2086-05-01" "2086-06-01" "2086-07-01" "2086-08-01" "2086-09-01" "2086-10-01"
 [995] "2086-11-01" "2086-12-01" "2087-01-01" "2087-02-01" "2087-03-01" "2087-04-01"
 [ reached getOption("max.print") -- omitted 164 entries ]
time <-as.Date(time)
out <- as.matrix(YF85_out_response)         ## convert from coda to matrix

code from AMW for splitting up this matrix

x_cols <- grep('^x', colnames(out))
obs_cols <- grep('^OBS', colnames(out))

out_x <- out[,x_cols]
out_obs <- out[,obs_cols]

rm(out)

out_x <- t(out_x)

out_x <- as.data.frame(out_x)
out_x2 <- out_x |>
  tibble::rownames_to_column(var = 'time_pond') |>
  dplyr::mutate(timestep = sub(x = time_pond,
                               pattern = '.*x\\[',
                               replacement = ''),
                timestep = sub(x = timestep,
                               pattern = ',.*',
                               replacement = ''),
                pond = sub(x = time_pond,
                           pattern = '.*,',
                           replacement = ''),
                pond = sub(x = pond,
                           pattern = '\\]',
                           replacement = '')) |>
  tidyr::pivot_longer(-c(time_pond, timestep, pond),
                      names_to = 'iter', values_to = 'val') |>
  dplyr::group_by(pond, timestep) |>
  dplyr::summarize(low = quantile(val, probs = 0.025),
                   med = median(val),
                   high = quantile(val, probs = 0.975))
`summarise()` has grouped output by 'pond'. You can override using the `.groups` argument.
timesteps <- as.data.frame(time)
timesteps$ind <- as.character(seq(from = 1, to = nrow(timesteps), by = 1))
colnames(timesteps) <- c('time', 'timestep')

ponds <- as.data.frame(colnames(YF_WaterTemp85[-1]))
ponds$ind <- as.character(seq(from = 1, to = nrow(ponds), by = 1))
colnames(ponds) <- c('pond_name', 'pond')

out_x_mapped <- out_x2 |>
  dplyr::left_join(y = timesteps, by = 'timestep') |>
  dplyr::left_join(y = ponds, by = 'pond') |>
  dplyr::select(low, med, high, time, pond_name)
Adding missing grouping variables: `pond`
pX <- out_x_mapped |>
  ggplot2::ggplot() +
  ggplot2::geom_line(ggplot2::aes(x = time, y = med)) +
  ggplot2::geom_ribbon(ggplot2::aes(x = time, ymin = low, ymax = high)) +
  ggplot2::facet_wrap(~pond_name)

out_obs <- t(out_obs)

out_obs <- as.data.frame(out_obs)

out_obs2 <- out_obs |>
  tibble::rownames_to_column(var = 'time_pond') |>
  dplyr::mutate(timestep = sub(x = time_pond,
                               pattern = '.*OBS\\[',
                               replacement = ''),
                timestep = sub(x = timestep,
                               pattern = ',.*',
                               replacement = ''),
                pond = sub(x = time_pond,
                           pattern = '.*,',
                           replacement = ''),
                pond = sub(x = pond,
                           pattern = '\\]',
                           replacement = '')) |>
  tidyr::pivot_longer(-c(time_pond, timestep, pond),
                      names_to = 'iter', values_to = 'val') |>
  dplyr::group_by(pond, timestep) |>
  dplyr::summarize(low = quantile(val, probs = 0.025),
                   med = median(val),
                   high = quantile(val, probs = 0.975))
`summarise()` has grouped output by 'pond'. You can override using the `.groups` argument.
out_obs_mapped <- out_obs2 |>
  dplyr::left_join(y = timesteps, by = 'timestep') |>
  dplyr::left_join(y = ponds, by = 'pond') |>
  dplyr::select(low, med, high, time, pond_name)
Adding missing grouping variables: `pond`
pOBS <- out_obs_mapped |>
  ggplot2::ggplot() +
  ggplot2::geom_line(ggplot2::aes(x = time, y = med)) +
  ggplot2::geom_ribbon(ggplot2::aes(x = time, ymin = low, ymax = high)) +
  ggplot2::facet_wrap(~pond_name)

cowplot::plot_grid(pX, pOBS)

Probability of Crossing Threshold

threshold_probs <- out_obs |>
  tibble::rownames_to_column(var = 'time_pond') |>
  dplyr::mutate(timestep = sub(x = time_pond,
                               pattern = '.*OBS\\[',
                               replacement = ''),
                timestep = sub(x = timestep,
                               pattern = ',.*',
                               replacement = ''),
                pond = sub(x = time_pond,
                           pattern = '.*,',
                           replacement = ''),
                pond = sub(x = pond,
                           pattern = '\\]',
                           replacement = '')) |>
  tidyr::pivot_longer(-c(time_pond, timestep, pond),
                      names_to = 'iter', values_to = 'val') |>
  dplyr::group_by(pond, timestep) |>
  dplyr::summarize(n_iter = dplyr::n(),
                   n_thresh = sum(val > 20),
                   prob = (n_thresh / n_iter) * 100)
`summarise()` has grouped output by 'pond'. You can override using the `.groups` argument.
threshold_probs_mapped <- threshold_probs |>
  dplyr::left_join(y = timesteps, by = 'timestep') |>
  dplyr::left_join(y = ponds, by = 'pond')

threshold_probs_mapped |>
  ggplot2::ggplot() +
  ggplot2::geom_line(ggplot2::aes(x = time, y = prob)) +
  ggplot2::facet_wrap(~pond_name)

Save these ouputs using a .RDataFile type

save.image(file = "Corr_PooledMod_YF85.RData")
rsession-arm64(14651) MallocStackLogging: can't turn off malloc stack logging because it was not enabled.
#Currently this has all the information in it. Eventually could limit this to be just the relavent information for the remaining code below

Making Graphs

Load in this file here as long as no code changes are needed above

load(file = "Corr_PooledMod_YF85.RData")

Creating some nice plots of these

  1. colored panel plot (each ponds forecast with the median, high, and low plus a trend line)
# set up the colors here for the plots below so that each pond has the same color each time
Mod_YF85 <- out_obs_mapped
str(Mod_YF85)
gropd_df [12,804 × 6] (S3: grouped_df/tbl_df/tbl/data.frame)
 $ pond     : chr [1:12804] "1" "1" "1" "1" ...
 $ low      : Named num [1:12804] -6.03 6.62 -2.05 2.66 5.44 ...
  ..- attr(*, "names")= chr [1:12804] "2.5%" "2.5%" "2.5%" "2.5%" ...
 $ med      : num [1:12804] 0.166 6.62 2.018 6.625 9.66 ...
 $ high     : Named num [1:12804] 6.43 6.62 5.94 10.46 13.96 ...
  ..- attr(*, "names")= chr [1:12804] "97.5%" "97.5%" "97.5%" "97.5%" ...
 $ time     : Date[1:12804], format: "2012-01-01" "2012-10-01" "2012-04-01" ...
 $ pond_name: chr [1:12804] "MP1" "MP1" "MP1" "MP1" ...
 - attr(*, "groups")= tibble [11 × 2] (S3: tbl_df/tbl/data.frame)
  ..$ pond : chr [1:11] "1" "10" "11" "2" ...
  ..$ .rows: list<int> [1:11] 
  .. ..$ : int [1:1164] 1 2 3 4 5 6 7 8 9 10 ...
  .. ..$ : int [1:1164] 1165 1166 1167 1168 1169 1170 1171 1172 1173 1174 ...
  .. ..$ : int [1:1164] 2329 2330 2331 2332 2333 2334 2335 2336 2337 2338 ...
  .. ..$ : int [1:1164] 3493 3494 3495 3496 3497 3498 3499 3500 3501 3502 ...
  .. ..$ : int [1:1164] 4657 4658 4659 4660 4661 4662 4663 4664 4665 4666 ...
  .. ..$ : int [1:1164] 5821 5822 5823 5824 5825 5826 5827 5828 5829 5830 ...
  .. ..$ : int [1:1164] 6985 6986 6987 6988 6989 6990 6991 6992 6993 6994 ...
  .. ..$ : int [1:1164] 8149 8150 8151 8152 8153 8154 8155 8156 8157 8158 ...
  .. ..$ : int [1:1164] 9313 9314 9315 9316 9317 9318 9319 9320 9321 9322 ...
  .. ..$ : int [1:1164] 10477 10478 10479 10480 10481 10482 10483 10484 10485 10486 ...
  .. ..$ : int [1:1164] 11641 11642 11643 11644 11645 11646 11647 11648 11649 11650 ...
  .. ..@ ptype: int(0) 
  ..- attr(*, ".drop")= logi TRUE
write.csv(Mod_YF85, "Mod_YF85.csv")
rsession-arm64(14768) MallocStackLogging: can't turn off malloc stack logging because it was not enabled.
# Define the custom color palette
YF_colors <- c("#E41A1C", "#377EB8", "#4DAF4A", "#984EA3", "#FF7F00", "#FFFF33", "#A65628", "#F781BF", "lightblue", "lightgreen", "#6A3D9A")

# Ensure that YF_colors has the same length as the number of unique ponds
unique_ponds <- unique(Mod_YF85$pond_name)
if (length(YF_colors) != length(unique_ponds)) {
  stop("The number of colors in YF_colors does not match the number of unique ponds.")
}

# Create a named vector for YF_colors with pond names
color_mapping <- setNames(YF_colors, unique_ponds)

# Plotting
Ponds_YF85 <- ggplot(data = Mod_YF85, aes(x = time)) +
  geom_ribbon(aes(ymin = low, ymax = high, fill = pond_name)) +  # Add the ribbon with colors
  geom_line(aes(y = med, color = pond_name)) +  # Ensure lines are visible and colored by pond
  geom_smooth(aes(y = med, color = "grey"), size = 1) +  # Ensure lines are visible and colored by pond
  geom_vline(xintercept = as.Date("2020-12-01"), linetype = "dashed", color = "red") +  # Add vertical dashed red line
  facet_wrap(~ pond_name) +  # Facet by pond_name
  scale_color_manual(values = color_mapping) +  # Use custom colors for lines
  scale_fill_manual(values = color_mapping) +   # Use custom colors for ribbons
  xlab("Year") +
  ylab("Water Temperature (°C)") +
  theme_classic() +
  theme(plot.title = element_text(hjust = 0.5, size = 24),
        axis.title = element_text(size = 22),
        axis.text = element_text(size = 20),
        axis.text.x = element_text(angle = 45, hjust = 1),
        legend.position = "none",
        strip.text = element_text(size = 16))
rsession-arm64(14787) MallocStackLogging: can't turn off malloc stack logging because it was not enabled.
Ponds_YF85
`geom_smooth()` using method = 'gam' and formula = 'y ~ s(x, bs = "cs")'
ggsave("Corr_IndPonds_YF85.png", plot = Ponds_YF85, width = 8, height = 6)
`geom_smooth()` using method = 'gam' and formula = 'y ~ s(x, bs = "cs")'

Create plots of the trend by pond (geom smooth for each pond on the same plot for comparison)

# using the same aestetics as above

Trends_YF85 <- ggplot(data = Mod_YF85, aes(x = time)) +
  geom_smooth(aes(y = med, color = pond_name, fill = pond_name), alpha = 0.15, size = 1) +  # Smooth lines with colors by pond_name
  scale_color_manual(values = color_mapping) +
  scale_fill_manual(values = color_mapping) +   # Use custom colors for ribbons
  labs(
       x = "Year",
       y = "Water Temperature (°C)",
       color = "Pond Name",
       fill = "Pond Name") +  # Labels for legend
  theme_classic() +
  theme(plot.title = element_text(hjust = 0.5, size = 18),
        axis.title = element_text(size = 22),
        axis.text = element_text(size = 20),
        legend.position = "right",
        legend.text = element_text(size = 16), # Change the legend text size here
        legend.title = element_text(size = 20))
Trends_YF85
`geom_smooth()` using method = 'gam' and formula = 'y ~ s(x, bs = "cs")'
rsession-arm64(14797) MallocStackLogging: can't turn off malloc stack logging because it was not enabled.
ggsave("Corr_IndTrends_YF85.png", plot = Trends_YF85, width = 9, height = 6)
`geom_smooth()` using method = 'gam' and formula = 'y ~ s(x, bs = "cs")'

  1. probability plot (by pond)
probs_YF85 <- threshold_probs_mapped
write.csv(probs_YF85, "probs_YF85.csv")

Probs20_YF85 <- ggplot(data = probs_YF85, aes(x = time)) +
  geom_line(aes(y = prob, color = pond_name)) +  # Ensure lines are visible and colored by pond
  facet_wrap(~ pond_name) +  # Facet by pond_name
  scale_color_manual(values = color_mapping) +  # Use custom colors for lines
  xlab("Year") +
  ylab("Probability") +
  xlim(as.Date(c("2020-12-01", "2099-12-01"))) +
  ylim(0,50) +
  theme_classic() +
  theme(plot.title = element_text(hjust = 0.5, size = 24),
        axis.title = element_text(size = 22),
        axis.text = element_text(size = 20),
        axis.text.x = element_text(angle = 45, hjust = 1),
        legend.position = "none",
        strip.text = element_text(size = 16))
Probs20_YF85
Warning: Removed 2365 rows containing missing values or values outside the scale range (`geom_line()`).
rsession-arm64(14803) MallocStackLogging: can't turn off malloc stack logging because it was not enabled.
ggsave("Corr_Probs20_YF85.png", plot = Probs20_YF85, width = 9, height = 6)
Warning: Removed 2365 rows containing missing values or values outside the scale range (`geom_line()`).

  1. Model fits by pond
Mod_YF85

ModObs <- Mod_YF85 %>%
  filter(time < "2021-01-01")
range(ModObs$time)
[1] "2012-01-01" "2020-12-01"
ModelErrorPlot_YF85 <- ggplot(data = ModObs, aes(x = time)) +
  geom_ribbon(aes(ymin = low, ymax = high, fill = pond_name)) +  # Adjust fill colors
  geom_line(aes(y = med), color = "black") +  # Black lines for the median values
  facet_wrap(~ pond_name) +  # Facet by pond_name
  scale_fill_manual(values = color_mapping) +  # Apply custom color palette for ribbons
  labs(
       x = "Year",
       y = "Water Temperature (°C)",
       color = "Pond Name",
       fill = "Pond Name") +  # Labels for legend
  theme_classic() +
  theme(plot.title = element_text(hjust = 0.5, size = 18),
        axis.title = element_text(size = 22),
        axis.text = element_text(size = 20),
        axis.text.x = element_text(angle = 65, hjust = 1),
        legend.position = "none",
        strip.text = element_text(size = 16))
ModelErrorPlot_YF85
rsession-arm64(14805) MallocStackLogging: can't turn off malloc stack logging because it was not enabled.
ggsave("Corr_Error_YF85.png", plot = ModelErrorPlot_YF85, width = 9, height = 6)

Clear the environment

rm(list = ls())
LS0tCnRpdGxlOiAiUG9vbGVkIEZvcmVjYXN0IE1vZGVscyIKb3V0cHV0OiBodG1sX25vdGVib29rCi0tLQoKU2V0dGluZyB1cCB0aGUgUiB3b3Jrc3BhY2UKCmBgYHtyfQpsaWJyYXJ5KHRpZHl2ZXJzZSkKbGlicmFyeShyamFncykKbGlicmFyeShnZ3Bsb3QyKQpsaWJyYXJ5KGh5ZHJvR09GKQoKc2V0LnNlZWQoMSkKYGBgCgojIFN0YXJ0aW5nIHdpdGggdGhlIENvcHBlciBSaXZlciBEZWx0YSAoQ1JEKQoKIyMgUkNQIDQuNQoKIyMjIERlc2lnbiB0aGUgTW9kZWwKClJlYWQgaW4gdGhlIGRhdGEgaGVyZSwgd2hpY2ggaXMgYW4gb3V0cHV0IG9mIFhYIGNvZGUgZmlsZQoKVGhlbiBzZXBhcmF0ZSB0aGUgZGF0YSBpbnRvIGFpciBhbmQgd2F0ZXIgdGVtcGVyYXR1cmUgZmlsZXMKCmBgYHtyfQojIEFpciBhbmQgd2F0ZXIgdGVtcGVyYXR1cmUgZGF0YTogQ1IgbG9jYXRpb24sIDQuNSBzY2VuYXJpbwpDUl9UZW1wcyA8LSByZWFkLmNzdigiQ1JfNDVTTkFQRm9yZWNhc3QuY3N2IiwgaGVhZGVyPVRSVUUpCgojIEFpciB0ZW1wZXJhdHVyZSB2YXJpYWJsZXMKQ1JfQWlyVGVtcDQ1IDwtIENSX1RlbXBzICU+JQogIHNlbGVjdChkYXRlLCBBaXJwb3J0LCBBaXJfTW9udGhBdmcsIHN0ZCwgcHJlY2lzaW9uLCBSZWdpb24pCgojIFdhdGVyIHRlbXBlcmF0dXJlIHZhcmlhYmxlcwpDUl9XYXRlclRlbXA0NSA8LSBDUl9UZW1wcyAlPiUKICBzZWxlY3QoZGF0ZSwgQlZTLCBDQUIsIFRJTiwgU1FSLCBDQU4sIEVZUywgVElTLCBXREQsIFJITSkKCgojIFNldCB1cCBhIHN0cmluZyBvZiBhbGwgdGhlIGRhdGVzCnRpbWUgPC0gQ1JfV2F0ZXJUZW1wNDUkZGF0ZQpsZW5ndGgodGltZSkKYGBgCgpTZXR0aW5nIHVwIHRoZSByYW5kb20gd2FsayBtb2RlbAoKYGBge3J9CmRsbV9wb29sZWQgPC0gIgptb2RlbHsKIyMjIyBQcmlvcnMKZm9yKHAgaW4gMTpucCl7CnhbMSxwXSB+IGRub3JtKHhfaWMsIHRhdV9pYykgIyBJbml0aWFsIGNvbmRpdGlvbiBvZiB3YXRlciB0ZW1wZXJhdHVyZQp9CnRhdV9vYnMgfiBkZ2FtbWEoYV9vYnMsIHJfb2JzKSAjIFByaW9yIG9uIG9ic2VydmF0aW9uIGVycm9yCnRhdV9hZGQgfiBkZ2FtbWEoYV9hZGQsIHJfYWRkKSAjIFByaW9yIG9uIHByb2Nlc3MgZXJyb3IKCiMjIyMgRml4ZWQgRWZmZWN0cwpiZXRhIH4gZG1ub3JtKG11X2JldGEsIHRhdV9iZXRhKSAjIFByaW9yIG9uIGJldGEgY29lZmZpY2llbnRzCgpmb3IocCBpbiAxOm5wKXsKaW50W3BdIH4gZG5vcm0obXVfaW50LCB0YXVfaW50KSAjIFByaW9yIG9uIHBvbmQtc3BlY2lmaWMgaW50ZXJjZXB0cwp9CgojIyMjIERhdGEgTW9kZWwKZm9yKHQgaW4gMTpuKXsgIyBsb29wIG92ZXIgYWxsIHRpbWUgc3RlcHMKZm9yKHAgaW4gMTpucCl7Ck9CU1t0LHBdIH4gZG5vcm0oeFt0LHBdLCB0YXVfb2JzKSAjIE9ic2VydmVkIHdhdGVyIHRlbXBlcmF0dXJlIGlzIGRyYXduIGZyb20gbGF0ZW50IGFpciB0ZW1wZXJhdHVyZSB3aXRoIG9ic2VydmF0aW9uIHVuY2VydGFpbnR5Cn0KWGZbdF0gfiBkbm9ybShtdUFpclRlbXBbdF0sIHRhdUFpclRlbXBbdF0pICMgTGF0ZW50IGFpciB0ZW1wZXJhdHVyZSBpcyBkcmF3biBmcm9tIG1lYW4gYW5kIHByZWNpc2lvbiBvZiBmb3JlY2FzYXRlZCBhaXIgdGVtcGVyYXR1cmUKfQoKIyMjIyBQcm9jZXNzIE1vZGVsCmZvcih0IGluIDI6bil7ICMgbG9vcCBvdmVyIGFsbCB0aW1lIHN0ZXBzIGV4Y2VwdCB0ZWggZmlyc3QgKHdlIGRlZmluZWQgaWMgYWJvdmUpCmZvcihwIGluIDE6bnApewptdVt0LHBdIDwtIHhbdC0xLHBdICsgaW50W3BdICsgYmV0YVsxXSAqIHhbdC0xLHBdICsgYmV0YVsyXSAqIFhmW3RdICMgTWVhbiB3YXRlciB0ZW1wZXJhdHVyZSBpcyBhIGZ1bmN0aW9uIG9mIHRoZSBwcmV2aW91cyB0aW1lIHN0ZXAgYW5kIGN1cnJlbnQgYWlyIHRlbXBlcmF0dXJlCnhbdCxwXSB+IGRub3JtKG11W3QscF0sIHRhdV9hZGQpICMgTGF0ZW50IHdhdGVyIHRlbXBlcmF0dXJlIGlzIGRyYXduIGZyb20gbWVhbiB3YXRlciB0ZW1wZXJhdHVyZSB3aXRoIHByb2Nlc3MgdW5jZXJ0YWludHkKfQp9Cn0KIgpgYGAKCkRlZmluZSB0aGUgZGF0YSBhbmQgcHJpb3JzIGZvciB0aGUgbW9kZWwKCmBgYHtyfQojIEVtcHR5IGxpc3QKZGF0YSA8LSBsaXN0KCkKIyBXYXRlciB0ZW1wZXJhdHVyZSBvYnNlcnZhdGlvbnMKZGF0YSRPQlMgPC0gZHBseXI6OnNlbGVjdChDUl9XYXRlclRlbXA0NSwgLWRhdGUpCiMgTnVtYmVyIG9mIHRpbWUgc3RlcHMKZGF0YSRuIDwtIG5yb3coZGF0YSRPQlMpCiMgTnVtYmVyIG9mIHBvbmRzCmRhdGEkbnAgPC0gbmNvbChkYXRhJE9CUykKIyBJbml0aWFsIHdhdGVyIHRlbXBlcmF0dXJlIG1lYW4KZGF0YSR4X2ljIDwtIDAuMQojIEluaXRpYWwgd2F0ZXIgdGVtcGVyYXR1cmUgcHJlY2lzaW9uCmRhdGEkdGF1X2ljID0gMC4xCiMgUHJpb3IgcGFyYW1ldGVycyBmb3Igb2JzZXJ2YXRpb24gYW5kIHByb2Nlc3MgdW5jZXJ0YWludHkKZGF0YSRhX29icyA9IDEKZGF0YSRyX29icyA9IDEKZGF0YSRhX2FkZCA9IDEKZGF0YSRyX2FkZCA9IDEKIyBQcmlvciBwYXJhbWV0ZXJzIGZvciBiZXRhIGNvZWZmaWNpZW50cwpkYXRhJG11X2JldGEgPC0gYygwLCAwKQpkYXRhJHRhdV9iZXRhIDwtIGRpYWcoeCA9IGMoMC4wMDEsIDAuMDAxKSwgbnJvdyA9IDIsIG5jb2wgPSAyKQojIFByaW9yIHBhcmFtZXRlcnMgZm9yIGludGVyY2VwdApkYXRhJG11X2ludCA8LSAwCmRhdGEkdGF1X2ludCA8LSAwLjAwMQojIE1lYW4gYWlyIHRlbXBlcmF0dXJlIGVzdGltYXRlCmRhdGEkbXVBaXJUZW1wIDwtIENSX0FpclRlbXA0NSRBaXJfTW9udGhBdmcKIyBBaXIgdGVtcGVyYXR1cmUgcHJlY2lzaW9uCmRhdGEkdGF1QWlyVGVtcCA8LSBDUl9BaXJUZW1wNDUkcHJlY2lzaW9uCgpgYGAKCkNyZWF0ZSBKQUdTIG1vZGVsIHdpdGggMyBjaGFpbnMKCmBgYHtyfQpqbSA8LSBqYWdzLm1vZGVsKGZpbGUgPSB0ZXh0Q29ubmVjdGlvbihkbG1fcG9vbGVkKSwgZGF0YSA9IGRhdGEsIG4uY2hhaW5zID0gMykKYGBgCgpQb3N0ZXJpb3Igc2FtcGxlcyBvZiBwYXJhbWV0ZXJzCgpgYGB7cn0KQ1JENDVfb3V0X3BhcmFtcyA8LSBjb2RhLnNhbXBsZXMobW9kZWwgPSBqbSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhcmlhYmxlLm5hbWVzID0gYygnYmV0YScsICdpbnQnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd0YXVfYWRkJywgJ3RhdV9vYnMnKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG4uaXRlciA9IDUwMDAwLCB0aGluID0gMjUpCmBgYAoKUG9zdGVyaW9yIHNhbXBsZXMgb2YgcmVzcG9uc2UgdmFyaWFibGVzCgpgYGB7cn0KQ1JENDVfb3V0X3Jlc3BvbnNlIDwtIGNvZGEuc2FtcGxlcyhtb2RlbCA9IGptLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXJpYWJsZS5uYW1lcyA9IGMoJ3gnLCAnT0JTJyksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG4uaXRlciA9IDEwMDAwMCwgdGhpbiA9IDI1KQpgYGAKCkEgY291cGxlIHF1aWNrIGNoZWNrcyBoZXJlCgpgYGB7cn0KIyBwbG90KENSRDQ1X291dF9wYXJhbXMpCmdlbG1hbi5kaWFnKENSRDQ1X291dF9wYXJhbXMsIGNvbmZpZGVuY2UgPSAwLjk5KQoKYGBgCgpWaXN1YWxpemUgdGhlIG91dHB1dCBieSBqdXN0IGxvb2tpbmcgYXQgdGhlICoqOTUlIGNyZWRpYmxlIGludGVydmFsIG9mIHRoZSB0aW1lLXNlcmllcyBvZiBYJ3MqKiBhbmQgY29tcGFyZSB0aGF0IHRvIHRoZSBvYnNlcnZlZCBZJ3MKClRyYW5zZm9ybSB0aGUgc2FtcGxlcyBiYWNrIGZyb20gdGhlIGxvZyBkb21haW4gdG8gdGhlIGxpbmVhciBkb21haW4KCmBgYHtyfQp0aW1lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMjIGFkanVzdCB0byB6b29tIGluIGFuZCBvdXQKdGltZSA8LWFzLkRhdGUodGltZSkKb3V0IDwtIGFzLm1hdHJpeChDUkQ0NV9vdXRfcmVzcG9uc2UpICAgICAgICAgIyMgY29udmVydCBmcm9tIGNvZGEgdG8gbWF0cml4CmBgYAoKY29kZSBmcm9tIEFNVyBmb3Igc3BsaXR0aW5nIHVwIHRoaXMgbWF0cml4CmBgYHtyfQp4X2NvbHMgPC0gZ3JlcCgnXngnLCBjb2xuYW1lcyhvdXQpKQpvYnNfY29scyA8LSBncmVwKCdeT0JTJywgY29sbmFtZXMob3V0KSkKCm91dF94IDwtIG91dFsseF9jb2xzXQpvdXRfb2JzIDwtIG91dFssb2JzX2NvbHNdCgpybShvdXQpCgpvdXRfeCA8LSB0KG91dF94KQoKb3V0X3ggPC0gYXMuZGF0YS5mcmFtZShvdXRfeCkKb3V0X3gyIDwtIG91dF94IHw+CiAgdGliYmxlOjpyb3duYW1lc190b19jb2x1bW4odmFyID0gJ3RpbWVfcG9uZCcpIHw+CiAgZHBseXI6Om11dGF0ZSh0aW1lc3RlcCA9IHN1Yih4ID0gdGltZV9wb25kLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0dGVybiA9ICcuKnhcXFsnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwbGFjZW1lbnQgPSAnJyksCiAgICAgICAgICAgICAgICB0aW1lc3RlcCA9IHN1Yih4ID0gdGltZXN0ZXAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXR0ZXJuID0gJywuKicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXBsYWNlbWVudCA9ICcnKSwKICAgICAgICAgICAgICAgIHBvbmQgPSBzdWIoeCA9IHRpbWVfcG9uZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0dGVybiA9ICcuKiwnLAogICAgICAgICAgICAgICAgICAgICAgICAgICByZXBsYWNlbWVudCA9ICcnKSwKICAgICAgICAgICAgICAgIHBvbmQgPSBzdWIoeCA9IHBvbmQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdHRlcm4gPSAnXFxdJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwbGFjZW1lbnQgPSAnJykpIHw+CiAgdGlkeXI6OnBpdm90X2xvbmdlcigtYyh0aW1lX3BvbmQsIHRpbWVzdGVwLCBwb25kKSwKICAgICAgICAgICAgICAgICAgICAgIG5hbWVzX3RvID0gJ2l0ZXInLCB2YWx1ZXNfdG8gPSAndmFsJykgfD4KICBkcGx5cjo6Z3JvdXBfYnkocG9uZCwgdGltZXN0ZXApIHw+CiAgZHBseXI6OnN1bW1hcml6ZShsb3cgPSBxdWFudGlsZSh2YWwsIHByb2JzID0gMC4wMjUpLAogICAgICAgICAgICAgICAgICAgbWVkID0gbWVkaWFuKHZhbCksCiAgICAgICAgICAgICAgICAgICBoaWdoID0gcXVhbnRpbGUodmFsLCBwcm9icyA9IDAuOTc1KSkKCnRpbWVzdGVwcyA8LSBhcy5kYXRhLmZyYW1lKHRpbWUpCnRpbWVzdGVwcyRpbmQgPC0gYXMuY2hhcmFjdGVyKHNlcShmcm9tID0gMSwgdG8gPSBucm93KHRpbWVzdGVwcyksIGJ5ID0gMSkpCmNvbG5hbWVzKHRpbWVzdGVwcykgPC0gYygndGltZScsICd0aW1lc3RlcCcpCgpwb25kcyA8LSBhcy5kYXRhLmZyYW1lKGNvbG5hbWVzKENSX1dhdGVyVGVtcDQ1Wy0xXSkpCnBvbmRzJGluZCA8LSBhcy5jaGFyYWN0ZXIoc2VxKGZyb20gPSAxLCB0byA9IG5yb3cocG9uZHMpLCBieSA9IDEpKQpjb2xuYW1lcyhwb25kcykgPC0gYygncG9uZF9uYW1lJywgJ3BvbmQnKQoKb3V0X3hfbWFwcGVkIDwtIG91dF94MiB8PgogIGRwbHlyOjpsZWZ0X2pvaW4oeSA9IHRpbWVzdGVwcywgYnkgPSAndGltZXN0ZXAnKSB8PgogIGRwbHlyOjpsZWZ0X2pvaW4oeSA9IHBvbmRzLCBieSA9ICdwb25kJykgfD4KICBkcGx5cjo6c2VsZWN0KGxvdywgbWVkLCBoaWdoLCB0aW1lLCBwb25kX25hbWUpCgpwWCA8LSBvdXRfeF9tYXBwZWQgfD4KICBnZ3Bsb3QyOjpnZ3Bsb3QoKSArCiAgZ2dwbG90Mjo6Z2VvbV9saW5lKGdncGxvdDI6OmFlcyh4ID0gdGltZSwgeSA9IG1lZCkpICsKICBnZ3Bsb3QyOjpnZW9tX3JpYmJvbihnZ3Bsb3QyOjphZXMoeCA9IHRpbWUsIHltaW4gPSBsb3csIHltYXggPSBoaWdoKSkgKwogIGdncGxvdDI6OmZhY2V0X3dyYXAofnBvbmRfbmFtZSkKCm91dF9vYnMgPC0gdChvdXRfb2JzKQoKb3V0X29icyA8LSBhcy5kYXRhLmZyYW1lKG91dF9vYnMpCgpvdXRfb2JzMiA8LSBvdXRfb2JzIHw+CiAgdGliYmxlOjpyb3duYW1lc190b19jb2x1bW4odmFyID0gJ3RpbWVfcG9uZCcpIHw+CiAgZHBseXI6Om11dGF0ZSh0aW1lc3RlcCA9IHN1Yih4ID0gdGltZV9wb25kLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0dGVybiA9ICcuKk9CU1xcWycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXBsYWNlbWVudCA9ICcnKSwKICAgICAgICAgICAgICAgIHRpbWVzdGVwID0gc3ViKHggPSB0aW1lc3RlcCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdHRlcm4gPSAnLC4qJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcGxhY2VtZW50ID0gJycpLAogICAgICAgICAgICAgICAgcG9uZCA9IHN1Yih4ID0gdGltZV9wb25kLAogICAgICAgICAgICAgICAgICAgICAgICAgICBwYXR0ZXJuID0gJy4qLCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcGxhY2VtZW50ID0gJycpLAogICAgICAgICAgICAgICAgcG9uZCA9IHN1Yih4ID0gcG9uZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0dGVybiA9ICdcXF0nLAogICAgICAgICAgICAgICAgICAgICAgICAgICByZXBsYWNlbWVudCA9ICcnKSkgfD4KICB0aWR5cjo6cGl2b3RfbG9uZ2VyKC1jKHRpbWVfcG9uZCwgdGltZXN0ZXAsIHBvbmQpLAogICAgICAgICAgICAgICAgICAgICAgbmFtZXNfdG8gPSAnaXRlcicsIHZhbHVlc190byA9ICd2YWwnKSB8PgogIGRwbHlyOjpncm91cF9ieShwb25kLCB0aW1lc3RlcCkgfD4KICBkcGx5cjo6c3VtbWFyaXplKGxvdyA9IHF1YW50aWxlKHZhbCwgcHJvYnMgPSAwLjAyNSksCiAgICAgICAgICAgICAgICAgICBtZWQgPSBtZWRpYW4odmFsKSwKICAgICAgICAgICAgICAgICAgIGhpZ2ggPSBxdWFudGlsZSh2YWwsIHByb2JzID0gMC45NzUpKQoKb3V0X29ic19tYXBwZWQgPC0gb3V0X29iczIgfD4KICBkcGx5cjo6bGVmdF9qb2luKHkgPSB0aW1lc3RlcHMsIGJ5ID0gJ3RpbWVzdGVwJykgfD4KICBkcGx5cjo6bGVmdF9qb2luKHkgPSBwb25kcywgYnkgPSAncG9uZCcpIHw+CiAgZHBseXI6OnNlbGVjdChsb3csIG1lZCwgaGlnaCwgdGltZSwgcG9uZF9uYW1lKQoKcE9CUyA8LSBvdXRfb2JzX21hcHBlZCB8PgogIGdncGxvdDI6OmdncGxvdCgpICsKICBnZ3Bsb3QyOjpnZW9tX2xpbmUoZ2dwbG90Mjo6YWVzKHggPSB0aW1lLCB5ID0gbWVkKSkgKwogIGdncGxvdDI6Omdlb21fcmliYm9uKGdncGxvdDI6OmFlcyh4ID0gdGltZSwgeW1pbiA9IGxvdywgeW1heCA9IGhpZ2gpKSArCiAgZ2dwbG90Mjo6ZmFjZXRfd3JhcCh+cG9uZF9uYW1lKQoKY293cGxvdDo6cGxvdF9ncmlkKHBYLCBwT0JTKQpgYGAKCiMjIyBQcm9iYWJpbGl0eSBvZiBDcm9zc2luZyBUaHJlc2hvbGQKCmBgYHtyfQp0aHJlc2hvbGRfcHJvYnMgPC0gb3V0X29icyB8PgogIHRpYmJsZTo6cm93bmFtZXNfdG9fY29sdW1uKHZhciA9ICd0aW1lX3BvbmQnKSB8PgogIGRwbHlyOjptdXRhdGUodGltZXN0ZXAgPSBzdWIoeCA9IHRpbWVfcG9uZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdHRlcm4gPSAnLipPQlNcXFsnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwbGFjZW1lbnQgPSAnJyksCiAgICAgICAgICAgICAgICB0aW1lc3RlcCA9IHN1Yih4ID0gdGltZXN0ZXAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXR0ZXJuID0gJywuKicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXBsYWNlbWVudCA9ICcnKSwKICAgICAgICAgICAgICAgIHBvbmQgPSBzdWIoeCA9IHRpbWVfcG9uZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0dGVybiA9ICcuKiwnLAogICAgICAgICAgICAgICAgICAgICAgICAgICByZXBsYWNlbWVudCA9ICcnKSwKICAgICAgICAgICAgICAgIHBvbmQgPSBzdWIoeCA9IHBvbmQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdHRlcm4gPSAnXFxdJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwbGFjZW1lbnQgPSAnJykpIHw+CiAgdGlkeXI6OnBpdm90X2xvbmdlcigtYyh0aW1lX3BvbmQsIHRpbWVzdGVwLCBwb25kKSwKICAgICAgICAgICAgICAgICAgICAgIG5hbWVzX3RvID0gJ2l0ZXInLCB2YWx1ZXNfdG8gPSAndmFsJykgfD4KICBkcGx5cjo6Z3JvdXBfYnkocG9uZCwgdGltZXN0ZXApIHw+CiAgZHBseXI6OnN1bW1hcml6ZShuX2l0ZXIgPSBkcGx5cjo6bigpLAogICAgICAgICAgICAgICAgICAgbl90aHJlc2ggPSBzdW0odmFsID4gMjApLAogICAgICAgICAgICAgICAgICAgcHJvYiA9IChuX3RocmVzaCAvIG5faXRlcikgKiAxMDApCgp0aHJlc2hvbGRfcHJvYnNfbWFwcGVkIDwtIHRocmVzaG9sZF9wcm9icyB8PgogIGRwbHlyOjpsZWZ0X2pvaW4oeSA9IHRpbWVzdGVwcywgYnkgPSAndGltZXN0ZXAnKSB8PgogIGRwbHlyOjpsZWZ0X2pvaW4oeSA9IHBvbmRzLCBieSA9ICdwb25kJykKCnRocmVzaG9sZF9wcm9ic19tYXBwZWQgfD4KICBnZ3Bsb3QyOjpnZ3Bsb3QoKSArCiAgZ2dwbG90Mjo6Z2VvbV9saW5lKGdncGxvdDI6OmFlcyh4ID0gdGltZSwgeSA9IHByb2IpKSArCiAgZ2dwbG90Mjo6ZmFjZXRfd3JhcCh+cG9uZF9uYW1lKQpgYGAKClNhdmUgdGhlc2Ugb3VwdXRzIHVzaW5nIGEgLlJEYXRhRmlsZSB0eXBlCgpgYGB7cn0Kc2F2ZS5pbWFnZShmaWxlID0gIkNvcnJfUG9vbGVkTW9kX0NSRDQ1LlJEYXRhIikKCiNDdXJyZW50bHkgdGhpcyBoYXMgYWxsIHRoZSBpbmZvcm1hdGlvbiBpbiBpdC4gRXZlbnR1YWxseSBjb3VsZCBsaW1pdCB0aGlzIHRvIGJlIGp1c3QgdGhlIHJlbGF2ZW50IGluZm9ybWF0aW9uIGZvciB0aGUgcmVtYWluaW5nIGNvZGUgYmVsb3cKYGBgCgojIyMgTWFraW5nIEdyYXBocwoKTG9hZCBpbiB0aGlzIGZpbGUgaGVyZSBhcyBsb25nIGFzIG5vIGNvZGUgY2hhbmdlcyBhcmUgbmVlZGVkIGFib3ZlCgpgYGB7cn0KbG9hZChmaWxlID0gIkNvcnJfUG9vbGVkTW9kX0NSRDQ1LlJEYXRhIikKYGBgCgpDcmVhdGluZyBzb21lIG5pY2UgcGxvdHMgb2YgdGhlc2UKCjEuIGNvbG9yZWQgcGFuZWwgcGxvdCAoZWFjaCBwb25kcyBmb3JlY2FzdCB3aXRoIHRoZSBtZWRpYW4sIGhpZ2gsIGFuZCBsb3cgcGx1cyBhIHRyZW5kIGxpbmUpCmBgYHtyfQojIHNldCB1cCB0aGUgY29sb3JzIGhlcmUgZm9yIHRoZSBwbG90cyBiZWxvdyBzbyB0aGF0IGVhY2ggcG9uZCBoYXMgdGhlIHNhbWUgY29sb3IgZWFjaCB0aW1lCk1vZF9DUkQ0NSA8LSBvdXRfb2JzX21hcHBlZApzdHIoTW9kX0NSRDQ1KQp3cml0ZS5jc3YoTW9kX0NSRDQ1LCAiQ29ycl9Nb2RfQ1JENDUuY3N2IikKCiMgRGVmaW5lIHRoZSBjdXN0b20gY29sb3IgcGFsZXR0ZQpDUl9jb2xvcnMgPC0gYygiI0U0MUExQyIsICIjMzc3RUI4IiwgIiM0REFGNEEiLCAiIzk4NEVBMyIsICIjRkY3RjAwIiwgIiNGRkZGMzMiLCAiI0E2NTYyOCIsICIjRjc4MUJGIiwgImxpZ2h0Ymx1ZSIpCgojIEVuc3VyZSB0aGF0IENSX2NvbG9ycyBoYXMgdGhlIHNhbWUgbGVuZ3RoIGFzIHRoZSBudW1iZXIgb2YgdW5pcXVlIHBvbmRzCnVuaXF1ZV9wb25kcyA8LSB1bmlxdWUoTW9kX0NSRDQ1JHBvbmRfbmFtZSkKaWYgKGxlbmd0aChDUl9jb2xvcnMpICE9IGxlbmd0aCh1bmlxdWVfcG9uZHMpKSB7CiAgc3RvcCgiVGhlIG51bWJlciBvZiBjb2xvcnMgaW4gQ1JfY29sb3JzIGRvZXMgbm90IG1hdGNoIHRoZSBudW1iZXIgb2YgdW5pcXVlIHBvbmRzLiIpCn0KCiMgQ3JlYXRlIGEgbmFtZWQgdmVjdG9yIGZvciBDUl9jb2xvcnMgd2l0aCBwb25kIG5hbWVzCmNvbG9yX21hcHBpbmcgPC0gc2V0TmFtZXMoQ1JfY29sb3JzLCB1bmlxdWVfcG9uZHMpCgojIFBsb3R0aW5nClBvbmRzX0NSRDQ1IDwtIGdncGxvdChkYXRhID0gTW9kX0NSRDQ1LCBhZXMoeCA9IHRpbWUpKSArCiAgZ2VvbV9yaWJib24oYWVzKHltaW4gPSBsb3csIHltYXggPSBoaWdoLCBmaWxsID0gcG9uZF9uYW1lKSkgKyAgIyBBZGQgdGhlIHJpYmJvbiB3aXRoIGNvbG9ycwogIGdlb21fbGluZShhZXMoeSA9IG1lZCwgY29sb3IgPSBwb25kX25hbWUpKSArICAjIEVuc3VyZSBsaW5lcyBhcmUgdmlzaWJsZSBhbmQgY29sb3JlZCBieSBwb25kCiAgZ2VvbV9zbW9vdGgoYWVzKHkgPSBtZWQsIGNvbG9yID0gImdyZXkiKSwgc2l6ZSA9IDEpICsgICMgRW5zdXJlIGxpbmVzIGFyZSB2aXNpYmxlIGFuZCBjb2xvcmVkIGJ5IHBvbmQKICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSBhcy5EYXRlKCIyMDIwLTEyLTAxIiksIGxpbmV0eXBlID0gImRhc2hlZCIsIGNvbG9yID0gInJlZCIpICsgICMgQWRkIHZlcnRpY2FsIGRhc2hlZCByZWQgbGluZQogIGZhY2V0X3dyYXAofiBwb25kX25hbWUpICsgICMgRmFjZXQgYnkgcG9uZF9uYW1lCiAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcyA9IGNvbG9yX21hcHBpbmcpICsgICMgVXNlIGN1c3RvbSBjb2xvcnMgZm9yIGxpbmVzCiAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzID0gY29sb3JfbWFwcGluZykgKyAgICMgVXNlIGN1c3RvbSBjb2xvcnMgZm9yIHJpYmJvbnMKICB4bGFiKCJZZWFyIikgKwogIHlsYWIoIldhdGVyIFRlbXBlcmF0dXJlICjCsEMpIikgKwogIHRoZW1lX2NsYXNzaWMoKSArCiAgdGhlbWUocGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDAuNSwgc2l6ZSA9IDI0KSwKICAgICAgICBheGlzLnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSAyMiksCiAgICAgICAgYXhpcy50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAyMCksCiAgICAgICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA0NSwgaGp1c3QgPSAxKSwKICAgICAgICBsZWdlbmQucG9zaXRpb24gPSAibm9uZSIsCiAgICAgICAgc3RyaXAudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTYpKQpQb25kc19DUkQ0NQoKZ2dzYXZlKCJDb3JyX0luZFBvbmRzX0NSRDQ1LnBuZyIsIHBsb3QgPSBQb25kc19DUkQ0NSwgd2lkdGggPSA4LCBoZWlnaHQgPSA2KQoKYGBgCgoyLiBUcmVuZCBieSBwb25kIChnZW9tIHNtb290aCBmb3IgZWFjaCBwb25kIG9uIHRoZSBzYW1lIHBsb3QgZm9yIGNvbXBhcmlzb24pCgpgYGB7cn0KIyB1c2luZyB0aGUgc2FtZSBhZXN0ZXRpY3MgYXMgYWJvdmUKClRyZW5kc19DUkQ0NSA8LSBnZ3Bsb3QoZGF0YSA9IE1vZF9DUkQ0NSwgYWVzKHggPSB0aW1lKSkgKwogIGdlb21fc21vb3RoKGFlcyh5ID0gbWVkLCBjb2xvciA9IHBvbmRfbmFtZSwgZmlsbCA9IHBvbmRfbmFtZSksIGFscGhhID0gMC4xNSwgc2l6ZSA9IDEpICsgICMgU21vb3RoIGxpbmVzIHdpdGggY29sb3JzIGJ5IHBvbmRfbmFtZQogIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXMgPSBjb2xvcl9tYXBwaW5nKSArCiAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzID0gY29sb3JfbWFwcGluZykgKyAgICMgVXNlIGN1c3RvbSBjb2xvcnMgZm9yIHJpYmJvbnMKICBsYWJzKAogICAgICAgeCA9ICJZZWFyIiwKICAgICAgIHkgPSAiV2F0ZXIgVGVtcGVyYXR1cmUgKMKwQykiLAogICAgICAgY29sb3IgPSAiUG9uZCBOYW1lIiwKICAgICAgIGZpbGwgPSAiUG9uZCBOYW1lIikgKyAgIyBMYWJlbHMgZm9yIGxlZ2VuZAogIHRoZW1lX2NsYXNzaWMoKSArCiAgdGhlbWUocGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDAuNSwgc2l6ZSA9IDE4KSwKICAgICAgICBheGlzLnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSAyMiksCiAgICAgICAgYXhpcy50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAyMCksCiAgICAgICAgbGVnZW5kLnBvc2l0aW9uID0gInJpZ2h0IiwKICAgICAgICBsZWdlbmQudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTYpLCAjIENoYW5nZSB0aGUgbGVnZW5kIHRleHQgc2l6ZSBoZXJlCiAgICAgICAgbGVnZW5kLnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSAyMCkpICMgUG9zaXRpb24gdGhlIGxlZ2VuZCBvbiB0aGUgcmlnaHQKVHJlbmRzX0NSRDQ1CgpnZ3NhdmUoIkNvcnJfSW5kVHJlbmRzX0NSRDQ1LnBuZyIsIHBsb3QgPSBUcmVuZHNfQ1JENDUsIHdpZHRoID0gOSwgaGVpZ2h0ID0gNikKCmBgYAoKMy4gcHJvYmFiaWxpdHkgcGxvdCAoYnkgcG9uZCkKCmBgYHtyfQpwcm9ic19DUkQ0NSA8LSB0aHJlc2hvbGRfcHJvYnNfbWFwcGVkCndyaXRlLmNzdihwcm9ic19DUkQ0NSwgIkNvcnJfcHJvYnNfQ1JENDUuY3N2IikKClByb2JzMjBfQ1JENDUgPC0gZ2dwbG90KGRhdGEgPSBwcm9ic19DUkQ0NSwgYWVzKHggPSB0aW1lKSkgKwogIGdlb21fbGluZShhZXMoeSA9IHByb2IsIGNvbG9yID0gcG9uZF9uYW1lKSkgKyAgIyBFbnN1cmUgbGluZXMgYXJlIHZpc2libGUgYW5kIGNvbG9yZWQgYnkgcG9uZAogIGZhY2V0X3dyYXAofiBwb25kX25hbWUpICsgICMgRmFjZXQgYnkgcG9uZF9uYW1lCiAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcyA9IGNvbG9yX21hcHBpbmcpICsgICMgVXNlIGN1c3RvbSBjb2xvcnMgZm9yIGxpbmVzCiAgeGxhYigiWWVhciIpICsKICB5bGFiKCJQcm9iYWJpbGl0eSIpICsKICB4bGltKGFzLkRhdGUoYygiMjAyMC0xMi0wMSIsICIyMDk5LTEyLTAxIikpKSArCiAgeWxpbSgwLDUwKSArCiAgdGhlbWVfY2xhc3NpYygpICsKICB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMC41LCBzaXplID0gMTgpLAogICAgICAgIGF4aXMudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDIyKSwKICAgICAgICBheGlzLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE4KSwKICAgICAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDU1LCBoanVzdCA9IDEpLAogICAgICAgIGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIiwKICAgICAgICBzdHJpcC50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNikpClByb2JzMjBfQ1JENDUKCmdnc2F2ZSgiQ29ycl9Qcm9iczIwX0NSRDQ1LnBuZyIsIHBsb3QgPSBQcm9iczIwX0NSRDQ1LCB3aWR0aCA9IDksIGhlaWdodCA9IDYpCmBgYAoKNC4gTW9kZWwgZml0cyBieSBwb25kCgpgYGB7cn0KTW9kX0NSRDQ1CgpNb2RPYnMgPC0gTW9kX0NSRDQ1ICU+JQogIGZpbHRlcih0aW1lIDwgIjIwMjEtMDEtMDEiKQpyYW5nZShNb2RPYnMkdGltZSkKCk1vZGVsRXJyb3JQbG90X0NSRDQ1IDwtIGdncGxvdChkYXRhID0gTW9kT2JzLCBhZXMoeCA9IHRpbWUpKSArCiAgZ2VvbV9yaWJib24oYWVzKHltaW4gPSBsb3csIHltYXggPSBoaWdoLCBmaWxsID0gcG9uZF9uYW1lKSkgKyAgIyBBZGp1c3QgZmlsbCBjb2xvcnMKICBnZW9tX2xpbmUoYWVzKHkgPSBtZWQpLCBjb2xvciA9ICJibGFjayIpICsgICMgQmxhY2sgbGluZXMgZm9yIHRoZSBtZWRpYW4gdmFsdWVzCiAgZmFjZXRfd3JhcCh+IHBvbmRfbmFtZSkgKyAgIyBGYWNldCBieSBwb25kX25hbWUKICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXMgPSBjb2xvcl9tYXBwaW5nKSArICAjIEFwcGx5IGN1c3RvbSBjb2xvciBwYWxldHRlIGZvciByaWJib25zCiAgbGFicygKICAgICAgIHggPSAiWWVhciIsCiAgICAgICB5ID0gIldhdGVyIFRlbXBlcmF0dXJlICjCsEMpIiwKICAgICAgIGNvbG9yID0gIlBvbmQgTmFtZSIsCiAgICAgICBmaWxsID0gIlBvbmQgTmFtZSIpICsgICMgTGFiZWxzIGZvciBsZWdlbmQKICB0aGVtZV9jbGFzc2ljKCkgKwogIHRoZW1lKAogICAgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDAuNSksCiAgICBheGlzLnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNiksCiAgICBheGlzLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE0KSwKICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gNDUsIGhqdXN0ID0gMSksCiAgICBsZWdlbmQucG9zaXRpb24gPSAibm9uZSIgIyBBbmdsZSB4LWF4aXMgbGFiZWxzIGlmIG5lZWRlZAogICkKTW9kZWxFcnJvclBsb3RfQ1JENDUKCmdnc2F2ZSgiQ29ycl9FcnJvcl9DUkQ0NS5wbmciLCBwbG90ID0gTW9kZWxFcnJvclBsb3RfQ1JENDUsIHdpZHRoID0gOSwgaGVpZ2h0ID0gNikKYGBgCgpDbGVhciBvdXQgdGhlIGVudmlyb25tZW50IGFuZCByZWxvYWQgdGhlIGJhc2ljcyBiZWZvcmUgc3RhcnRpbmcgdGhlIG5leHQgc2VjdGlvbgoKYGBge3J9CnJtKGxpc3QgPSBscygpKQoKbGlicmFyeSh0aWR5dmVyc2UpCmxpYnJhcnkocmphZ3MpCmxpYnJhcnkoZ2dwbG90MikKCnNldC5zZWVkKDEpCmBgYAoKCiMjIFJDUCA4LjUKCiMjIyBEZXNpZ24gdGhlIE1vZGVsCgpSZWFkIGluIHRoZSBkYXRhIGhlcmUsIHdoaWNoIGlzIGFuIG91dHB1dCBvZiBYWCBjb2RlIGZpbGUKClRoZW4gc2VwYXJhdGUgdGhlIGRhdGEgaW50byBhaXIgYW5kIHdhdGVyIHRlbXBlcmF0dXJlIGZpbGVzCgpgYGB7cn0KIyBBaXIgYW5kIHdhdGVyIHRlbXBlcmF0dXJlIGRhdGE6IENSIGxvY2NhdGlvbiwgNC41IHNjZW5hcmlvCkNSX1RlbXBzIDwtIHJlYWQuY3N2KCJDUl84NVNOQVBGb3JlY2FzdC5jc3YiLCBoZWFkZXI9VFJVRSkKCiMgQWlyIHRlbXBlcmF0dXJlIHZhcmlhYmxlcwpDUl9BaXJUZW1wODUgPC0gQ1JfVGVtcHMgJT4lCiAgc2VsZWN0KGRhdGUsIEFpcnBvcnQsIEFpcl9Nb250aEF2Zywgc3RkLCBwcmVjaXNpb24sIFJlZ2lvbikKCiMgV2F0ZXIgdGVtcGVyYXR1cmUgdmFyaWFibGVzCkNSX1dhdGVyVGVtcDg1IDwtIENSX1RlbXBzICU+JQogIHNlbGVjdChkYXRlLCBCVlMsIENBQiwgVElOLCBTUVIsIENBTiwgRVlTLCBUSVMsIFdERCwgUkhNKQoKCiMgU2V0IHVwIGEgc3RyaW5nIG9mIGFsbCB0aGUgZGF0ZXMKdGltZSA8LSBDUl9XYXRlclRlbXA4NSRkYXRlCmxlbmd0aCh0aW1lKQpgYGAKClNldHRpbmcgdXAgdGhlIHJhbmRvbSB3YWxrIG1vZGVsCgpgYGB7cn0KZGxtX3Bvb2xlZCA8LSAiCm1vZGVsewojIyMjIFByaW9ycwpmb3IocCBpbiAxOm5wKXsKeFsxLHBdIH4gZG5vcm0oeF9pYywgdGF1X2ljKSAjIEluaXRpYWwgY29uZGl0aW9uIG9mIHdhdGVyIHRlbXBlcmF0dXJlCn0KdGF1X29icyB+IGRnYW1tYShhX29icywgcl9vYnMpICMgUHJpb3Igb24gb2JzZXJ2YXRpb24gZXJyb3IKdGF1X2FkZCB+IGRnYW1tYShhX2FkZCwgcl9hZGQpICMgUHJpb3Igb24gcHJvY2VzcyBlcnJvcgoKIyMjIyBGaXhlZCBFZmZlY3RzCmJldGEgfiBkbW5vcm0obXVfYmV0YSwgdGF1X2JldGEpICMgUHJpb3Igb24gYmV0YSBjb2VmZmljaWVudHMKCmZvcihwIGluIDE6bnApewppbnRbcF0gfiBkbm9ybShtdV9pbnQsIHRhdV9pbnQpICMgUHJpb3Igb24gcG9uZC1zcGVjaWZpYyBpbnRlcmNlcHRzCn0KCiMjIyMgRGF0YSBNb2RlbApmb3IodCBpbiAxOm4peyAjIGxvb3Agb3ZlciBhbGwgdGltZSBzdGVwcwpmb3IocCBpbiAxOm5wKXsKT0JTW3QscF0gfiBkbm9ybSh4W3QscF0sIHRhdV9vYnMpICMgT2JzZXJ2ZWQgd2F0ZXIgdGVtcGVyYXR1cmUgaXMgZHJhd24gZnJvbSBsYXRlbnQgYWlyIHRlbXBlcmF0dXJlIHdpdGggb2JzZXJ2YXRpb24gdW5jZXJ0YWludHkKfQpYZlt0XSB+IGRub3JtKG11QWlyVGVtcFt0XSwgdGF1QWlyVGVtcFt0XSkgIyBMYXRlbnQgYWlyIHRlbXBlcmF0dXJlIGlzIGRyYXduIGZyb20gbWVhbiBhbmQgcHJlY2lzaW9uIG9mIGZvcmVjYXNhdGVkIGFpciB0ZW1wZXJhdHVyZQp9CgojIyMjIFByb2Nlc3MgTW9kZWwKZm9yKHQgaW4gMjpuKXsgIyBsb29wIG92ZXIgYWxsIHRpbWUgc3RlcHMgZXhjZXB0IHRlaCBmaXJzdCAod2UgZGVmaW5lZCBpYyBhYm92ZSkKZm9yKHAgaW4gMTpucCl7Cm11W3QscF0gPC0geFt0LTEscF0gKyBpbnRbcF0gKyBiZXRhWzFdICogeFt0LTEscF0gKyBiZXRhWzJdICogWGZbdF0gIyBNZWFuIHdhdGVyIHRlbXBlcmF0dXJlIGlzIGEgZnVuY3Rpb24gb2YgdGhlIHByZXZpb3VzIHRpbWUgc3RlcCBhbmQgY3VycmVudCBhaXIgdGVtcGVyYXR1cmUKeFt0LHBdIH4gZG5vcm0obXVbdCxwXSwgdGF1X2FkZCkgIyBMYXRlbnQgd2F0ZXIgdGVtcGVyYXR1cmUgaXMgZHJhd24gZnJvbSBtZWFuIHdhdGVyIHRlbXBlcmF0dXJlIHdpdGggcHJvY2VzcyB1bmNlcnRhaW50eQp9Cn0KfQoiCmBgYAoKRGVmaW5lIHRoZSBkYXRhIGFuZCBwcmlvcnMgZm9yIHRoZSBtb2RlbAoKYGBge3J9CiMgRW1wdHkgbGlzdApkYXRhIDwtIGxpc3QoKQojIFdhdGVyIHRlbXBlcmF0dXJlIG9ic2VydmF0aW9ucwpkYXRhJE9CUyA8LSBkcGx5cjo6c2VsZWN0KENSX1dhdGVyVGVtcDg1LCAtZGF0ZSkKIyBOdW1iZXIgb2YgdGltZSBzdGVwcwpkYXRhJG4gPC0gbnJvdyhkYXRhJE9CUykKIyBOdW1iZXIgb2YgcG9uZHMKZGF0YSRucCA8LSBuY29sKGRhdGEkT0JTKQojIEluaXRpYWwgd2F0ZXIgdGVtcGVyYXR1cmUgbWVhbgpkYXRhJHhfaWMgPC0gMC4xCiMgSW5pdGlhbCB3YXRlciB0ZW1wZXJhdHVyZSBwcmVjaXNpb24KZGF0YSR0YXVfaWMgPSAwLjEKIyBQcmlvciBwYXJhbWV0ZXJzIGZvciBvYnNlcnZhdGlvbiBhbmQgcHJvY2VzcyB1bmNlcnRhaW50eQpkYXRhJGFfb2JzID0gMQpkYXRhJHJfb2JzID0gMQpkYXRhJGFfYWRkID0gMQpkYXRhJHJfYWRkID0gMQojIFByaW9yIHBhcmFtZXRlcnMgZm9yIGJldGEgY29lZmZpY2llbnRzCmRhdGEkbXVfYmV0YSA8LSBjKDAsIDApCmRhdGEkdGF1X2JldGEgPC0gZGlhZyh4ID0gYygwLjAwMSwgMC4wMDEpLCBucm93ID0gMiwgbmNvbCA9IDIpCiMgUHJpb3IgcGFyYW1ldGVycyBmb3IgaW50ZXJjZXB0CmRhdGEkbXVfaW50IDwtIDAKZGF0YSR0YXVfaW50IDwtIDAuMDAxCiMgTWVhbiBhaXIgdGVtcGVyYXR1cmUgZXN0aW1hdGUKZGF0YSRtdUFpclRlbXAgPC0gQ1JfQWlyVGVtcDg1JEFpcl9Nb250aEF2ZwojIEFpciB0ZW1wZXJhdHVyZSBwcmVjaXNpb24KZGF0YSR0YXVBaXJUZW1wIDwtIENSX0FpclRlbXA4NSRwcmVjaXNpb24KCmBgYAoKQ3JlYXRlIEpBR1MgbW9kZWwgd2l0aCAzIGNoYWlucwoKYGBge3J9CmptIDwtIGphZ3MubW9kZWwoZmlsZSA9IHRleHRDb25uZWN0aW9uKGRsbV9wb29sZWQpLCBkYXRhID0gZGF0YSwgbi5jaGFpbnMgPSAzKQpgYGAKClBvc3RlcmlvciBzYW1wbGVzIG9mIHBhcmFtZXRlcnMKCmBgYHtyfQpDUkQ4NV9vdXRfcGFyYW1zIDwtIGNvZGEuc2FtcGxlcyhtb2RlbCA9IGptLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyaWFibGUubmFtZXMgPSBjKCdiZXRhJywgJ2ludCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3RhdV9hZGQnLCAndGF1X29icycpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbi5pdGVyID0gNTAwMDAsIHRoaW4gPSAyNSkKYGBgCgpQb3N0ZXJpb3Igc2FtcGxlcyBvZiByZXNwb25zZSB2YXJpYWJsZXMKCmBgYHtyfQpDUkQ4NV9vdXRfcmVzcG9uc2UgPC0gY29kYS5zYW1wbGVzKG1vZGVsID0gam0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhcmlhYmxlLm5hbWVzID0gYygneCcsICdPQlMnKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbi5pdGVyID0gMTAwMDAwLCB0aGluID0gMjUpCmBgYAoKQSBjb3VwbGUgcXVpY2sgY2hlY2tzIGhlcmUKCmBgYHtyfQojIHBsb3QoQ1JEODVfb3V0X3BhcmFtcykKZ2VsbWFuLmRpYWcoQ1JEODVfb3V0X3BhcmFtcywgY29uZmlkZW5jZSA9IDAuOTkpCgpgYGAKClZpc3VhbGl6ZSB0aGUgb3V0cHV0IGJ5IGp1c3QgbG9va2luZyBhdCB0aGUgKio5NSUgY3JlZGlibGUgaW50ZXJ2YWwgb2YgdGhlIHRpbWUtc2VyaWVzIG9mIFgncyoqIGFuZCBjb21wYXJlIHRoYXQgdG8gdGhlIG9ic2VydmVkIFkncwoKVHJhbnNmb3JtIHRoZSBzYW1wbGVzIGJhY2sgZnJvbSB0aGUgbG9nIGRvbWFpbiB0byB0aGUgbGluZWFyIGRvbWFpbgoKYGBge3J9CnRpbWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyMgYWRqdXN0IHRvIHpvb20gaW4gYW5kIG91dAp0aW1lIDwtYXMuRGF0ZSh0aW1lKQpvdXQgPC0gYXMubWF0cml4KENSRDg1X291dF9yZXNwb25zZSkgICAgICAgICAjIyBjb252ZXJ0IGZyb20gY29kYSB0byBtYXRyaXgKYGBgCgpjb2RlIGZyb20gQU1XIGZvciBzcGxpdHRpbmcgdXAgdGhpcyBtYXRyaXgKYGBge3J9CnhfY29scyA8LSBncmVwKCdeeCcsIGNvbG5hbWVzKG91dCkpCm9ic19jb2xzIDwtIGdyZXAoJ15PQlMnLCBjb2xuYW1lcyhvdXQpKQoKb3V0X3ggPC0gb3V0Wyx4X2NvbHNdCm91dF9vYnMgPC0gb3V0WyxvYnNfY29sc10KCnJtKG91dCkKCm91dF94IDwtIHQob3V0X3gpCgpvdXRfeCA8LSBhcy5kYXRhLmZyYW1lKG91dF94KQpvdXRfeDIgPC0gb3V0X3ggfD4KICB0aWJibGU6OnJvd25hbWVzX3RvX2NvbHVtbih2YXIgPSAndGltZV9wb25kJykgfD4KICBkcGx5cjo6bXV0YXRlKHRpbWVzdGVwID0gc3ViKHggPSB0aW1lX3BvbmQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXR0ZXJuID0gJy4qeFxcWycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXBsYWNlbWVudCA9ICcnKSwKICAgICAgICAgICAgICAgIHRpbWVzdGVwID0gc3ViKHggPSB0aW1lc3RlcCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdHRlcm4gPSAnLC4qJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcGxhY2VtZW50ID0gJycpLAogICAgICAgICAgICAgICAgcG9uZCA9IHN1Yih4ID0gdGltZV9wb25kLAogICAgICAgICAgICAgICAgICAgICAgICAgICBwYXR0ZXJuID0gJy4qLCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcGxhY2VtZW50ID0gJycpLAogICAgICAgICAgICAgICAgcG9uZCA9IHN1Yih4ID0gcG9uZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0dGVybiA9ICdcXF0nLAogICAgICAgICAgICAgICAgICAgICAgICAgICByZXBsYWNlbWVudCA9ICcnKSkgfD4KICB0aWR5cjo6cGl2b3RfbG9uZ2VyKC1jKHRpbWVfcG9uZCwgdGltZXN0ZXAsIHBvbmQpLAogICAgICAgICAgICAgICAgICAgICAgbmFtZXNfdG8gPSAnaXRlcicsIHZhbHVlc190byA9ICd2YWwnKSB8PgogIGRwbHlyOjpncm91cF9ieShwb25kLCB0aW1lc3RlcCkgfD4KICBkcGx5cjo6c3VtbWFyaXplKGxvdyA9IHF1YW50aWxlKHZhbCwgcHJvYnMgPSAwLjAyNSksCiAgICAgICAgICAgICAgICAgICBtZWQgPSBtZWRpYW4odmFsKSwKICAgICAgICAgICAgICAgICAgIGhpZ2ggPSBxdWFudGlsZSh2YWwsIHByb2JzID0gMC45NzUpKQoKdGltZXN0ZXBzIDwtIGFzLmRhdGEuZnJhbWUodGltZSkKdGltZXN0ZXBzJGluZCA8LSBhcy5jaGFyYWN0ZXIoc2VxKGZyb20gPSAxLCB0byA9IG5yb3codGltZXN0ZXBzKSwgYnkgPSAxKSkKY29sbmFtZXModGltZXN0ZXBzKSA8LSBjKCd0aW1lJywgJ3RpbWVzdGVwJykKCnBvbmRzIDwtIGFzLmRhdGEuZnJhbWUoY29sbmFtZXMoQ1JfV2F0ZXJUZW1wODVbLTFdKSkKcG9uZHMkaW5kIDwtIGFzLmNoYXJhY3RlcihzZXEoZnJvbSA9IDEsIHRvID0gbnJvdyhwb25kcyksIGJ5ID0gMSkpCmNvbG5hbWVzKHBvbmRzKSA8LSBjKCdwb25kX25hbWUnLCAncG9uZCcpCgpvdXRfeF9tYXBwZWQgPC0gb3V0X3gyIHw+CiAgZHBseXI6OmxlZnRfam9pbih5ID0gdGltZXN0ZXBzLCBieSA9ICd0aW1lc3RlcCcpIHw+CiAgZHBseXI6OmxlZnRfam9pbih5ID0gcG9uZHMsIGJ5ID0gJ3BvbmQnKSB8PgogIGRwbHlyOjpzZWxlY3QobG93LCBtZWQsIGhpZ2gsIHRpbWUsIHBvbmRfbmFtZSkKCnBYIDwtIG91dF94X21hcHBlZCB8PgogIGdncGxvdDI6OmdncGxvdCgpICsKICBnZ3Bsb3QyOjpnZW9tX2xpbmUoZ2dwbG90Mjo6YWVzKHggPSB0aW1lLCB5ID0gbWVkKSkgKwogIGdncGxvdDI6Omdlb21fcmliYm9uKGdncGxvdDI6OmFlcyh4ID0gdGltZSwgeW1pbiA9IGxvdywgeW1heCA9IGhpZ2gpKSArCiAgZ2dwbG90Mjo6ZmFjZXRfd3JhcCh+cG9uZF9uYW1lKQoKb3V0X29icyA8LSB0KG91dF9vYnMpCgpvdXRfb2JzIDwtIGFzLmRhdGEuZnJhbWUob3V0X29icykKCm91dF9vYnMyIDwtIG91dF9vYnMgfD4KICB0aWJibGU6OnJvd25hbWVzX3RvX2NvbHVtbih2YXIgPSAndGltZV9wb25kJykgfD4KICBkcGx5cjo6bXV0YXRlKHRpbWVzdGVwID0gc3ViKHggPSB0aW1lX3BvbmQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXR0ZXJuID0gJy4qT0JTXFxbJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcGxhY2VtZW50ID0gJycpLAogICAgICAgICAgICAgICAgdGltZXN0ZXAgPSBzdWIoeCA9IHRpbWVzdGVwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0dGVybiA9ICcsLionLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwbGFjZW1lbnQgPSAnJyksCiAgICAgICAgICAgICAgICBwb25kID0gc3ViKHggPSB0aW1lX3BvbmQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdHRlcm4gPSAnLiosJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwbGFjZW1lbnQgPSAnJyksCiAgICAgICAgICAgICAgICBwb25kID0gc3ViKHggPSBwb25kLAogICAgICAgICAgICAgICAgICAgICAgICAgICBwYXR0ZXJuID0gJ1xcXScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcGxhY2VtZW50ID0gJycpKSB8PgogIHRpZHlyOjpwaXZvdF9sb25nZXIoLWModGltZV9wb25kLCB0aW1lc3RlcCwgcG9uZCksCiAgICAgICAgICAgICAgICAgICAgICBuYW1lc190byA9ICdpdGVyJywgdmFsdWVzX3RvID0gJ3ZhbCcpIHw+CiAgZHBseXI6Omdyb3VwX2J5KHBvbmQsIHRpbWVzdGVwKSB8PgogIGRwbHlyOjpzdW1tYXJpemUobG93ID0gcXVhbnRpbGUodmFsLCBwcm9icyA9IDAuMDI1KSwKICAgICAgICAgICAgICAgICAgIG1lZCA9IG1lZGlhbih2YWwpLAogICAgICAgICAgICAgICAgICAgaGlnaCA9IHF1YW50aWxlKHZhbCwgcHJvYnMgPSAwLjk3NSkpCgpvdXRfb2JzX21hcHBlZCA8LSBvdXRfb2JzMiB8PgogIGRwbHlyOjpsZWZ0X2pvaW4oeSA9IHRpbWVzdGVwcywgYnkgPSAndGltZXN0ZXAnKSB8PgogIGRwbHlyOjpsZWZ0X2pvaW4oeSA9IHBvbmRzLCBieSA9ICdwb25kJykgfD4KICBkcGx5cjo6c2VsZWN0KGxvdywgbWVkLCBoaWdoLCB0aW1lLCBwb25kX25hbWUpCgpwT0JTIDwtIG91dF9vYnNfbWFwcGVkIHw+CiAgZ2dwbG90Mjo6Z2dwbG90KCkgKwogIGdncGxvdDI6Omdlb21fbGluZShnZ3Bsb3QyOjphZXMoeCA9IHRpbWUsIHkgPSBtZWQpKSArCiAgZ2dwbG90Mjo6Z2VvbV9yaWJib24oZ2dwbG90Mjo6YWVzKHggPSB0aW1lLCB5bWluID0gbG93LCB5bWF4ID0gaGlnaCkpICsKICBnZ3Bsb3QyOjpmYWNldF93cmFwKH5wb25kX25hbWUpCgpjb3dwbG90OjpwbG90X2dyaWQocFgsIHBPQlMpCmBgYAoKIyMjIFByb2JhYmlsaXR5IG9mIENyb3NzaW5nIFRocmVzaG9sZAoKYGBge3J9CnRocmVzaG9sZF9wcm9icyA8LSBvdXRfb2JzIHw+CiAgdGliYmxlOjpyb3duYW1lc190b19jb2x1bW4odmFyID0gJ3RpbWVfcG9uZCcpIHw+CiAgZHBseXI6Om11dGF0ZSh0aW1lc3RlcCA9IHN1Yih4ID0gdGltZV9wb25kLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0dGVybiA9ICcuKk9CU1xcWycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXBsYWNlbWVudCA9ICcnKSwKICAgICAgICAgICAgICAgIHRpbWVzdGVwID0gc3ViKHggPSB0aW1lc3RlcCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdHRlcm4gPSAnLC4qJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcGxhY2VtZW50ID0gJycpLAogICAgICAgICAgICAgICAgcG9uZCA9IHN1Yih4ID0gdGltZV9wb25kLAogICAgICAgICAgICAgICAgICAgICAgICAgICBwYXR0ZXJuID0gJy4qLCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcGxhY2VtZW50ID0gJycpLAogICAgICAgICAgICAgICAgcG9uZCA9IHN1Yih4ID0gcG9uZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0dGVybiA9ICdcXF0nLAogICAgICAgICAgICAgICAgICAgICAgICAgICByZXBsYWNlbWVudCA9ICcnKSkgfD4KICB0aWR5cjo6cGl2b3RfbG9uZ2VyKC1jKHRpbWVfcG9uZCwgdGltZXN0ZXAsIHBvbmQpLAogICAgICAgICAgICAgICAgICAgICAgbmFtZXNfdG8gPSAnaXRlcicsIHZhbHVlc190byA9ICd2YWwnKSB8PgogIGRwbHlyOjpncm91cF9ieShwb25kLCB0aW1lc3RlcCkgfD4KICBkcGx5cjo6c3VtbWFyaXplKG5faXRlciA9IGRwbHlyOjpuKCksCiAgICAgICAgICAgICAgICAgICBuX3RocmVzaCA9IHN1bSh2YWwgPiAyMCksCiAgICAgICAgICAgICAgICAgICBwcm9iID0gKG5fdGhyZXNoIC8gbl9pdGVyKSAqIDEwMCkKCnRocmVzaG9sZF9wcm9ic19tYXBwZWQgPC0gdGhyZXNob2xkX3Byb2JzIHw+CiAgZHBseXI6OmxlZnRfam9pbih5ID0gdGltZXN0ZXBzLCBieSA9ICd0aW1lc3RlcCcpIHw+CiAgZHBseXI6OmxlZnRfam9pbih5ID0gcG9uZHMsIGJ5ID0gJ3BvbmQnKQoKdGhyZXNob2xkX3Byb2JzX21hcHBlZCB8PgogIGdncGxvdDI6OmdncGxvdCgpICsKICBnZ3Bsb3QyOjpnZW9tX2xpbmUoZ2dwbG90Mjo6YWVzKHggPSB0aW1lLCB5ID0gcHJvYikpICsKICBnZ3Bsb3QyOjpmYWNldF93cmFwKH5wb25kX25hbWUpCmBgYAoKU2F2ZSB0aGVzZSBvdXB1dHMgdXNpbmcgYSAuUkRhdGFGaWxlIHR5cGUKCmBgYHtyfQpzYXZlLmltYWdlKGZpbGUgPSAiQ29ycl9Qb29sZWRNb2RfQ1JEODUuUkRhdGEiKQoKI0N1cnJlbnRseSB0aGlzIGhhcyBhbGwgdGhlIGluZm9ybWF0aW9uIGluIGl0LiBFdmVudHVhbGx5IGNvdWxkIGxpbWl0IHRoaXMgdG8gYmUganVzdCB0aGUgcmVsYXZlbnQgaW5mb3JtYXRpb24gZm9yIHRoZSByZW1haW5pbmcgY29kZSBiZWxvdwpgYGAKCiMjIyBNYWtlaW5nIEdyYXBocwoKTG9hZCBpbiB0aGlzIGZpbGUgaGVyZSBhcyBsb25nIGFzIG5vIGNvZGUgY2hhbmdlcyBhcmUgbmVlZGVkIGFib3ZlCgpgYGB7cn0KbG9hZChmaWxlID0gIkNvcnJfUG9vbGVkTW9kX0NSRDg1LlJEYXRhIikKYGBgCgpDcmVhdGluZyBzb21lIG5pY2UgcGxvdHMgb2YgdGhlc2UKCjEuIGNvbG9yZWQgcGFuZWwgcGxvdCAoZWFjaCBwb25kcyBmb3JlY2FzdCB3aXRoIHRoZSBtZWRpYW4sIGhpZ2gsIGFuZCBsb3cgcGx1cyBhIHRyZW5kIGxpbmUpCgpgYGB7cn0KIyBzZXQgdXAgdGhlIGNvbG9ycyBoZXJlIGZvciB0aGUgcGxvdHMgYmVsb3cgc28gdGhhdCBlYWNoIHBvbmQgaGFzIHRoZSBzYW1lIGNvbG9yIGVhY2ggdGltZQpNb2RfQ1JEODUgPC0gb3V0X29ic19tYXBwZWQKc3RyKE1vZF9DUkQ4NSkKd3JpdGUuY3N2KE1vZF9DUkQ4NSwgIkNvcnJfTW9kX0NSRDg1LmNzdiIpCgojIERlZmluZSB0aGUgY3VzdG9tIGNvbG9yIHBhbGV0dGUKQ1JfY29sb3JzIDwtIGMoIiNFNDFBMUMiLCAiIzM3N0VCOCIsICIjNERBRjRBIiwgIiM5ODRFQTMiLCAiI0ZGN0YwMCIsICIjRkZGRjMzIiwgIiNBNjU2MjgiLCAiI0Y3ODFCRiIsICJsaWdodGJsdWUiKQoKIyBFbnN1cmUgdGhhdCBDUl9jb2xvcnMgaGFzIHRoZSBzYW1lIGxlbmd0aCBhcyB0aGUgbnVtYmVyIG9mIHVuaXF1ZSBwb25kcwp1bmlxdWVfcG9uZHMgPC0gdW5pcXVlKE1vZF9DUkQ4NSRwb25kX25hbWUpCmlmIChsZW5ndGgoQ1JfY29sb3JzKSAhPSBsZW5ndGgodW5pcXVlX3BvbmRzKSkgewogIHN0b3AoIlRoZSBudW1iZXIgb2YgY29sb3JzIGluIENSX2NvbG9ycyBkb2VzIG5vdCBtYXRjaCB0aGUgbnVtYmVyIG9mIHVuaXF1ZSBwb25kcy4iKQp9CgojIENyZWF0ZSBhIG5hbWVkIHZlY3RvciBmb3IgQ1JfY29sb3JzIHdpdGggcG9uZCBuYW1lcwpjb2xvcl9tYXBwaW5nIDwtIHNldE5hbWVzKENSX2NvbG9ycywgdW5pcXVlX3BvbmRzKQoKIyBQbG90dGluZwpQb25kc19DUkQ4NSA8LSBnZ3Bsb3QoZGF0YSA9IE1vZF9DUkQ4NSwgYWVzKHggPSB0aW1lKSkgKwogIGdlb21fcmliYm9uKGFlcyh5bWluID0gbG93LCB5bWF4ID0gaGlnaCwgZmlsbCA9IHBvbmRfbmFtZSkpICsgICMgQWRkIHRoZSByaWJib24gd2l0aCBjb2xvcnMKICBnZW9tX2xpbmUoYWVzKHkgPSBtZWQsIGNvbG9yID0gcG9uZF9uYW1lKSkgKyAgIyBFbnN1cmUgbGluZXMgYXJlIHZpc2libGUgYW5kIGNvbG9yZWQgYnkgcG9uZAogIGdlb21fc21vb3RoKGFlcyh5ID0gbWVkLCBjb2xvciA9ICJncmV5IiksIHNpemUgPSAxKSArICAjIEVuc3VyZSBsaW5lcyBhcmUgdmlzaWJsZSBhbmQgY29sb3JlZCBieSBwb25kCiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gYXMuRGF0ZSgiMjAyMC0xMi0wMSIpLCBsaW5ldHlwZSA9ICJkYXNoZWQiLCBjb2xvciA9ICJyZWQiKSArICAjIEFkZCB2ZXJ0aWNhbCBkYXNoZWQgcmVkIGxpbmUKICBmYWNldF93cmFwKH4gcG9uZF9uYW1lKSArICAjIEZhY2V0IGJ5IHBvbmRfbmFtZQogIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXMgPSBjb2xvcl9tYXBwaW5nKSArICAjIFVzZSBjdXN0b20gY29sb3JzIGZvciBsaW5lcwogIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcyA9IGNvbG9yX21hcHBpbmcpICsgICAjIFVzZSBjdXN0b20gY29sb3JzIGZvciByaWJib25zCiAgeGxhYigiWWVhciIpICsKICB5bGFiKCJXYXRlciBUZW1wZXJhdHVyZSAowrBDKSIpICsKICB0aGVtZV9jbGFzc2ljKCkgKwogIHRoZW1lKHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoaGp1c3QgPSAwLjUsIHNpemUgPSAyNCksCiAgICAgICAgYXhpcy50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gMjIpLAogICAgICAgIGF4aXMudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gMjApLAogICAgICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gNDUsIGhqdXN0ID0gMSksCiAgICAgICAgbGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiLAogICAgICAgIHN0cmlwLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE2KSkKUG9uZHNfQ1JEODUKCmdnc2F2ZSgiQ29ycl9JbmRQb25kc19DUkQ4NS5wbmciLCBwbG90ID0gUG9uZHNfQ1JEODUsIHdpZHRoID0gOCwgaGVpZ2h0ID0gNikKCmBgYAoKMi4gdHJlbmQgYnkgcG9uZCAoZ2VvbSBzbW9vdGggZm9yIGVhY2ggcG9uZCBvbiB0aGUgc2FtZSBwbG90IGZvciBjb21wYXJpc29uKQoKYGBge3J9CiMgdXNpbmcgdGhlIHNhbWUgYWVzdGV0aWNzIGFzIGFib3ZlCgpUcmVuZHNfQ1JEODUgPC0gZ2dwbG90KGRhdGEgPSBNb2RfQ1JEODUsIGFlcyh4ID0gdGltZSkpICsKICBnZW9tX3Ntb290aChhZXMoeSA9IG1lZCwgY29sb3IgPSBwb25kX25hbWUsIGZpbGwgPSBwb25kX25hbWUpLCBhbHBoYSA9IDAuMTUsIHNpemUgPSAxKSArICAjIFNtb290aCBsaW5lcyB3aXRoIGNvbG9ycyBieSBwb25kX25hbWUKICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzID0gY29sb3JfbWFwcGluZykgKwogIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcyA9IGNvbG9yX21hcHBpbmcpICsgICAjIFVzZSBjdXN0b20gY29sb3JzIGZvciByaWJib25zCiAgbGFicygKICAgICAgIHggPSAiWWVhciIsCiAgICAgICB5ID0gIldhdGVyIFRlbXBlcmF0dXJlICjCsEMpIiwKICAgICAgIGNvbG9yID0gIlBvbmQgTmFtZSIsCiAgICAgICBmaWxsID0gIlBvbmQgTmFtZSIpICsgICMgTGFiZWxzIGZvciBsZWdlbmQKICB0aGVtZV9jbGFzc2ljKCkgKwogIHRoZW1lKHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoaGp1c3QgPSAwLjUsIHNpemUgPSAxOCksCiAgICAgICAgYXhpcy50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gMjIpLAogICAgICAgIGF4aXMudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gMjApLAogICAgICAgIGxlZ2VuZC5wb3NpdGlvbiA9ICJyaWdodCIsCiAgICAgICAgbGVnZW5kLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE2KSwgIyBDaGFuZ2UgdGhlIGxlZ2VuZCB0ZXh0IHNpemUgaGVyZQogICAgICAgIGxlZ2VuZC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gMjApKQpUcmVuZHNfQ1JEODUKCmdnc2F2ZSgiQ29ycl9JbmRUcmVuZHNfQ1JEODUucG5nIiwgcGxvdCA9IFRyZW5kc19DUkQ4NSwgd2lkdGggPSA5LCBoZWlnaHQgPSA2KQoKYGBgCgozLiBwcm9iYWJpbGl0eSBwbG90IChieSBwb25kKQoKYGBge3J9CnByb2JzX0NSRDg1IDwtIHRocmVzaG9sZF9wcm9ic19tYXBwZWQKd3JpdGUuY3N2KHByb2JzX0NSRDg1LCAicHJvYnNfQ1JEODUuY3N2IikKClByb2JzMjBfQ1JEODUgPC0gZ2dwbG90KGRhdGEgPSBwcm9ic19DUkQ4NSwgYWVzKHggPSB0aW1lKSkgKwogIGdlb21fbGluZShhZXMoeSA9IHByb2IsIGNvbG9yID0gcG9uZF9uYW1lKSkgKyAgIyBFbnN1cmUgbGluZXMgYXJlIHZpc2libGUgYW5kIGNvbG9yZWQgYnkgcG9uZAogIGZhY2V0X3dyYXAofiBwb25kX25hbWUpICsgICMgRmFjZXQgYnkgcG9uZF9uYW1lCiAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcyA9IGNvbG9yX21hcHBpbmcpICsgICMgVXNlIGN1c3RvbSBjb2xvcnMgZm9yIGxpbmVzCiAgeGxhYigiWWVhciIpICsKICB5bGFiKCJQcm9iYWJpbGl0eSIpICsKICB4bGltKGFzLkRhdGUoYygiMjAyMC0xMi0wMSIsICIyMDk5LTEyLTAxIikpKSArCiAgeWxpbSgwLDUwKSArCiAgdGhlbWVfY2xhc3NpYygpICsKICB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMC41LCBzaXplID0gMTgpLAogICAgICAgIGF4aXMudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDIyKSwKICAgICAgICBheGlzLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE4KSwKICAgICAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDU1LCBoanVzdCA9IDEpLAogICAgICAgIGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIiwKICAgICAgICBzdHJpcC50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNikpClByb2JzMjBfQ1JEODUKCmdnc2F2ZSgiQ29ycl9Qcm9iczIwX0NSRDg1LnBuZyIsIHBsb3QgPSBQcm9iczIwX0NSRDg1LCB3aWR0aCA9IDksIGhlaWdodCA9IDYpCmBgYAoKNC4gTW9kZWwgZml0cyBieSBwb25kCgpgYGB7cn0KTW9kX0NSRDg1CgpNb2RPYnMgPC0gTW9kX0NSRDg1ICU+JQogIGZpbHRlcih0aW1lIDwgIjIwMjEtMDEtMDEiKQpyYW5nZShNb2RPYnMkdGltZSkKCk1vZGVsRXJyb3JQbG90X0NSRDg1IDwtIGdncGxvdChkYXRhID0gTW9kT2JzLCBhZXMoeCA9IHRpbWUpKSArCiAgZ2VvbV9yaWJib24oYWVzKHltaW4gPSBsb3csIHltYXggPSBoaWdoLCBmaWxsID0gcG9uZF9uYW1lKSkgKyAgIyBBZGp1c3QgZmlsbCBjb2xvcnMKICBnZW9tX2xpbmUoYWVzKHkgPSBtZWQpLCBjb2xvciA9ICJibGFjayIpICsgICMgQmxhY2sgbGluZXMgZm9yIHRoZSBtZWRpYW4gdmFsdWVzCiAgZmFjZXRfd3JhcCh+IHBvbmRfbmFtZSkgKyAgIyBGYWNldCBieSBwb25kX25hbWUKICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXMgPSBjb2xvcl9tYXBwaW5nKSArICAjIEFwcGx5IGN1c3RvbSBjb2xvciBwYWxldHRlIGZvciByaWJib25zCiAgbGFicygKICAgICAgIHggPSAiWWVhciIsCiAgICAgICB5ID0gIldhdGVyIFRlbXBlcmF0dXJlICjCsEMpIiwKICAgICAgIGNvbG9yID0gIlBvbmQgTmFtZSIsCiAgICAgICBmaWxsID0gIlBvbmQgTmFtZSIpICsgICMgTGFiZWxzIGZvciBsZWdlbmQKICB0aGVtZV9jbGFzc2ljKCkgKwogIHRoZW1lKHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoaGp1c3QgPSAwLjUsIHNpemUgPSAyNCksCiAgICAgICAgYXhpcy50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gMjIpLAogICAgICAgIGF4aXMudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gMjApLAogICAgICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gNDUsIGhqdXN0ID0gMSksCiAgICAgICAgbGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiLAogICAgICAgIHN0cmlwLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE2KSkKTW9kZWxFcnJvclBsb3RfQ1JEODUKCmdnc2F2ZSgiQ29ycl9FcnJvcl9DUkQ4NS5wbmciLCBwbG90ID0gTW9kZWxFcnJvclBsb3RfQ1JEODUsIHdpZHRoID0gOSwgaGVpZ2h0ID0gNikKYGBgCgojIyMgQ2FsY3VsYXRpbmcgTlNFIHZhbHVlcwpgYGB7cn0KTW9kX0NSRDg1CgojIEZpbHRlciB0aGlzIHRvIG9ubHkgdGhlIG9ic2VydmF0aW9uYWwgZGF0YQpvYnNfQ1JEODUgPC0gTW9kX0NSRDg1ICU+JQogIGZpbHRlcih0aW1lIDwgYXMuRGF0ZSgiMjAyMC0wMS0wMSIpKSAlPiUKICB1bmdyb3VwKCkgJT4lCiAgYXMuZGF0YS5mcmFtZSgpCgojIENvbnZlcnQgdGhlICdkYXRlJyBjb2x1bW4gaW4gQ1JfV2F0ZXJUZW1wODUgdG8gRGF0ZSB0eXBlIGFuZCByZW5hbWUgaXQgdG8gJ3RpbWUnCkNSX1dhdGVyVGVtcDg1IDwtIENSX1dhdGVyVGVtcDg1ICU+JQogIG11dGF0ZSh0aW1lID0gYXMuRGF0ZShkYXRlKSkKCiMgQlZTICMjIyMKQlZTX0NSRCA8LSBvYnNfQ1JEODUgJT4lCiAgZmlsdGVyKHBvbmRfbmFtZSA9PSAiQlZTIikKCiMgUGVyZm9ybSB0aGUgbWVyZ2UgdG8gY29tYmluZSB0aGUgZGF0YSBmcmFtZXMgYmFzZWQgb24gdGhlIHRpbWUvZGF0ZSBjb2x1bW5zCkJWU19jb21iaW5lZCA8LSBCVlNfQ1JEICU+JQogIHNlbGVjdCh0aW1lLCBtZWQpICU+JQogIGxlZnRfam9pbihDUl9XYXRlclRlbXA4NSwgYnkgPSAidGltZSIpCgpCVlNfTlNFIDwtIE5TRShCVlNfY29tYmluZWQkbWVkLCBCVlNfY29tYmluZWQkQlZTLCBuYS5ybSA9IFRSVUUpCkJWU19OU0UKCiMgQ0FCICMjIyMKQ0FCX0NSRCA8LSBvYnNfQ1JEODUgJT4lCiAgZmlsdGVyKHBvbmRfbmFtZSA9PSAiQ0FCIikKCiMgUGVyZm9ybSB0aGUgbWVyZ2UgdG8gY29tYmluZSB0aGUgZGF0YSBmcmFtZXMgYmFzZWQgb24gdGhlIHRpbWUvZGF0ZSBjb2x1bW5zCkNBQl9jb21iaW5lZCA8LSBDQUJfQ1JEICU+JQogIHNlbGVjdCh0aW1lLCBtZWQpICU+JQogIGxlZnRfam9pbihDUl9XYXRlclRlbXA4NSwgYnkgPSAidGltZSIpCgpDQUJfTlNFIDwtIE5TRShDQUJfY29tYmluZWQkbWVkLCBDQUJfY29tYmluZWQkQ0FCLCBuYS5ybSA9IFRSVUUpCkNBQl9OU0UKCiMgQ0FOICMjIyMKQ0FOX0NSRCA8LSBvYnNfQ1JEODUgJT4lCiAgZmlsdGVyKHBvbmRfbmFtZSA9PSAiQ0FOIikKCiMgUGVyZm9ybSB0aGUgbWVyZ2UgdG8gY29tYmluZSB0aGUgZGF0YSBmcmFtZXMgYmFzZWQgb24gdGhlIHRpbWUvZGF0ZSBjb2x1bW5zCkNBTl9jb21iaW5lZCA8LSBDQU5fQ1JEICU+JQogIHNlbGVjdCh0aW1lLCBtZWQpICU+JQogIGxlZnRfam9pbihDUl9XYXRlclRlbXA4NSwgYnkgPSAidGltZSIpCgpDQU5fTlNFIDwtIE5TRShDQU5fY29tYmluZWQkbWVkLCBDQU5fY29tYmluZWQkQ0FOLCBuYS5ybSA9IFRSVUUpCkNBTl9OU0UKCiMgQ0FOICMjIyMKQ0FOX0NSRCA8LSBvYnNfQ1JEODUgJT4lCiAgZmlsdGVyKHBvbmRfbmFtZSA9PSAiQ0FOIikKCiMgUGVyZm9ybSB0aGUgbWVyZ2UgdG8gY29tYmluZSB0aGUgZGF0YSBmcmFtZXMgYmFzZWQgb24gdGhlIHRpbWUvZGF0ZSBjb2x1bW5zCkNBTl9jb21iaW5lZCA8LSBDQU5fQ1JEICU+JQogIHNlbGVjdCh0aW1lLCBtZWQpICU+JQogIGxlZnRfam9pbihDUl9XYXRlclRlbXA4NSwgYnkgPSAidGltZSIpCgpDQU5fTlNFIDwtIE5TRShDQU5fY29tYmluZWQkbWVkLCBDQU5fY29tYmluZWQkQ0FOLCBuYS5ybSA9IFRSVUUpCkNBTl9OU0UKYGBgCgpDbGVhciBvdXQgdGhlIGVudmlyb25tZW50IGFuZCByZWxvYWQgdGhlIGJhc2ljcyBiZWZvcmUgc3RhcnRpbmcgdGhlIG5leHQgc2VjdGlvbgoKYGBge3J9CnJtKGxpc3QgPSBscygpKQoKbGlicmFyeSh0aWR5dmVyc2UpCmxpYnJhcnkocmphZ3MpCmxpYnJhcnkoZ2dwbG90MikKCnNldC5zZWVkKDEpCmBgYAoKIyBDb250aW51ZWluZyB3aXRoIFlha3V0YXQgRm9yZWxhbmRzIChZRikKCiMjIFJDUCA0LjUKCiMjIyBEZXNpZ24gdGhlIE1vZGVsCgpSZWFkIGluIHRoZSBkYXRhIGhlcmUsIHdoaWNoIGlzIGFuIG91dHB1dCBvZiBYWCBjb2RlIGZpbGUKClRoZW4gc2VwYXJhdGUgdGhlIGRhdGEgaW50byBhaXIgYW5kIHdhdGVyIHRlbXBlcmF0dXJlIGZpbGVzCgpgYGB7cn0KIyBBaXIgYW5kIHdhdGVyIHRlbXBlcmF0dXJlIGRhdGE6IFlGIGxvY2F0aW9uLCA0LjUgc2NlbmFyaW8KWUZfVGVtcHMgPC0gcmVhZC5jc3YoIllGXzQ1U05BUEZvcmVjYXN0LmNzdiIsIGhlYWRlcj1UUlVFKQoKIyBBaXIgdGVtcGVyYXR1cmUgdmFyaWFibGVzCllGX0FpclRlbXA0NSA8LSBZRl9UZW1wcyAlPiUKICBzZWxlY3QoZGF0ZSwgQWlycG9ydCwgQWlyX01vbnRoQXZnLCBzdGQsIHByZWNpc2lvbiwgUmVnaW9uKQoKIyBXYXRlciB0ZW1wZXJhdHVyZSB2YXJpYWJsZXMKWUZfV2F0ZXJUZW1wNDUgPC0gWUZfVGVtcHMgJT4lCiAgc2VsZWN0KGRhdGUsIE1QMSwgTVAzLCBNUDUsIE1QOCwgUEwxLCBQTDIsIFBMMywgVUJQMSwgVUJQMiwgVUJQMywgVUJQNCkKCgojIFNldCB1cCBhIHN0cmluZyBvZiBhbGwgdGhlIGRhdGVzCnRpbWUgPC0gWUZfV2F0ZXJUZW1wNDUkZGF0ZQpsZW5ndGgodGltZSkKYGBgCgpTZXR0aW5nIHVwIHRoZSByYW5kb20gd2FsayBtb2RlbAoKYGBge3J9CmRsbV9wb29sZWQgPC0gIgptb2RlbHsKIyMjIyBQcmlvcnMKZm9yKHAgaW4gMTpucCl7CnhbMSxwXSB+IGRub3JtKHhfaWMsIHRhdV9pYykgIyBJbml0aWFsIGNvbmRpdGlvbiBvZiB3YXRlciB0ZW1wZXJhdHVyZQp9CnRhdV9vYnMgfiBkZ2FtbWEoYV9vYnMsIHJfb2JzKSAjIFByaW9yIG9uIG9ic2VydmF0aW9uIGVycm9yCnRhdV9hZGQgfiBkZ2FtbWEoYV9hZGQsIHJfYWRkKSAjIFByaW9yIG9uIHByb2Nlc3MgZXJyb3IKCiMjIyMgRml4ZWQgRWZmZWN0cwpiZXRhIH4gZG1ub3JtKG11X2JldGEsIHRhdV9iZXRhKSAjIFByaW9yIG9uIGJldGEgY29lZmZpY2llbnRzCgpmb3IocCBpbiAxOm5wKXsKaW50W3BdIH4gZG5vcm0obXVfaW50LCB0YXVfaW50KSAjIFByaW9yIG9uIHBvbmQtc3BlY2lmaWMgaW50ZXJjZXB0cwp9CgojIyMjIERhdGEgTW9kZWwKZm9yKHQgaW4gMTpuKXsgIyBsb29wIG92ZXIgYWxsIHRpbWUgc3RlcHMKZm9yKHAgaW4gMTpucCl7Ck9CU1t0LHBdIH4gZG5vcm0oeFt0LHBdLCB0YXVfb2JzKSAjIE9ic2VydmVkIHdhdGVyIHRlbXBlcmF0dXJlIGlzIGRyYXduIGZyb20gbGF0ZW50IGFpciB0ZW1wZXJhdHVyZSB3aXRoIG9ic2VydmF0aW9uIHVuY2VydGFpbnR5Cn0KWGZbdF0gfiBkbm9ybShtdUFpclRlbXBbdF0sIHRhdUFpclRlbXBbdF0pICMgTGF0ZW50IGFpciB0ZW1wZXJhdHVyZSBpcyBkcmF3biBmcm9tIG1lYW4gYW5kIHByZWNpc2lvbiBvZiBmb3JlY2FzYXRlZCBhaXIgdGVtcGVyYXR1cmUKfQoKIyMjIyBQcm9jZXNzIE1vZGVsCmZvcih0IGluIDI6bil7ICMgbG9vcCBvdmVyIGFsbCB0aW1lIHN0ZXBzIGV4Y2VwdCB0ZWggZmlyc3QgKHdlIGRlZmluZWQgaWMgYWJvdmUpCmZvcihwIGluIDE6bnApewptdVt0LHBdIDwtIHhbdC0xLHBdICsgaW50W3BdICsgYmV0YVsxXSAqIHhbdC0xLHBdICsgYmV0YVsyXSAqIFhmW3RdICMgTWVhbiB3YXRlciB0ZW1wZXJhdHVyZSBpcyBhIGZ1bmN0aW9uIG9mIHRoZSBwcmV2aW91cyB0aW1lIHN0ZXAgYW5kIGN1cnJlbnQgYWlyIHRlbXBlcmF0dXJlCnhbdCxwXSB+IGRub3JtKG11W3QscF0sIHRhdV9hZGQpICMgTGF0ZW50IHdhdGVyIHRlbXBlcmF0dXJlIGlzIGRyYXduIGZyb20gbWVhbiB3YXRlciB0ZW1wZXJhdHVyZSB3aXRoIHByb2Nlc3MgdW5jZXJ0YWludHkKfQp9Cn0KIgpgYGAKCkRlZmluZSB0aGUgZGF0YSBhbmQgcHJpb3JzIGZvciB0aGUgbW9kZWwKCmBgYHtyfQojIEVtcHR5IGxpc3QKZGF0YSA8LSBsaXN0KCkKIyBXYXRlciB0ZW1wZXJhdHVyZSBvYnNlcnZhdGlvbnMKZGF0YSRPQlMgPC0gZHBseXI6OnNlbGVjdChZRl9XYXRlclRlbXA0NSwgLWRhdGUpCiMgTnVtYmVyIG9mIHRpbWUgc3RlcHMKZGF0YSRuIDwtIG5yb3coZGF0YSRPQlMpCiMgTnVtYmVyIG9mIHBvbmRzCmRhdGEkbnAgPC0gbmNvbChkYXRhJE9CUykKIyBJbml0aWFsIHdhdGVyIHRlbXBlcmF0dXJlIG1lYW4KZGF0YSR4X2ljIDwtIDAuMQojIEluaXRpYWwgd2F0ZXIgdGVtcGVyYXR1cmUgcHJlY2lzaW9uCmRhdGEkdGF1X2ljID0gMC4xCiMgUHJpb3IgcGFyYW1ldGVycyBmb3Igb2JzZXJ2YXRpb24gYW5kIHByb2Nlc3MgdW5jZXJ0YWludHkKZGF0YSRhX29icyA9IDEKZGF0YSRyX29icyA9IDEKZGF0YSRhX2FkZCA9IDEKZGF0YSRyX2FkZCA9IDEKIyBQcmlvciBwYXJhbWV0ZXJzIGZvciBiZXRhIGNvZWZmaWNpZW50cwpkYXRhJG11X2JldGEgPC0gYygwLCAwKQpkYXRhJHRhdV9iZXRhIDwtIGRpYWcoeCA9IGMoMC4wMDEsIDAuMDAxKSwgbnJvdyA9IDIsIG5jb2wgPSAyKQojIFByaW9yIHBhcmFtZXRlcnMgZm9yIGludGVyY2VwdApkYXRhJG11X2ludCA8LSAwCmRhdGEkdGF1X2ludCA8LSAwLjAwMQojIE1lYW4gYWlyIHRlbXBlcmF0dXJlIGVzdGltYXRlCmRhdGEkbXVBaXJUZW1wIDwtIFlGX0FpclRlbXA0NSRBaXJfTW9udGhBdmcKIyBBaXIgdGVtcGVyYXR1cmUgcHJlY2lzaW9uCmRhdGEkdGF1QWlyVGVtcCA8LSBZRl9BaXJUZW1wNDUkcHJlY2lzaW9uCgpgYGAKCkNyZWF0ZSBKQUdTIG1vZGVsIHdpdGggMyBjaGFpbnMKCmBgYHtyfQpqbSA8LSBqYWdzLm1vZGVsKGZpbGUgPSB0ZXh0Q29ubmVjdGlvbihkbG1fcG9vbGVkKSwgZGF0YSA9IGRhdGEsIG4uY2hhaW5zID0gMykKYGBgCgpQb3N0ZXJpb3Igc2FtcGxlcyBvZiBwYXJhbWV0ZXJzCgpgYGB7cn0KWUY0NV9vdXRfcGFyYW1zIDwtIGNvZGEuc2FtcGxlcyhtb2RlbCA9IGptLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyaWFibGUubmFtZXMgPSBjKCdiZXRhJywgJ2ludCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3RhdV9hZGQnLCAndGF1X29icycpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbi5pdGVyID0gMTAwMDAwLCB0aGluID0gMjUpCmBgYAoKUG9zdGVyaW9yIHNhbXBsZXMgb2YgcmVzcG9uc2UgdmFyaWFibGVzCgpgYGB7cn0KWUY0NV9vdXRfcmVzcG9uc2UgPC0gY29kYS5zYW1wbGVzKG1vZGVsID0gam0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhcmlhYmxlLm5hbWVzID0gYygneCcsICdPQlMnKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbi5pdGVyID0gMTAwMDAwLCB0aGluID0gMjUpCmBgYAoKQSBjb3VwbGUgcXVpY2sgY2hlY2tzIGhlcmUKCmBgYHtyfQojIHBsb3QoWUY0NV9vdXRfcGFyYW1zKQpnZWxtYW4uZGlhZyhZRjQ1X291dF9wYXJhbXMsIGNvbmZpZGVuY2UgPSAwLjk5KQoKYGBgCgpWaXN1YWxpemUgdGhlIG91dHB1dCBieSBqdXN0IGxvb2tpbmcgYXQgdGhlICoqOTUlIGNyZWRpYmxlIGludGVydmFsIG9mIHRoZSB0aW1lLXNlcmllcyBvZiBYJ3MqKiBhbmQgY29tcGFyZSB0aGF0IHRvIHRoZSBvYnNlcnZlZCBZJ3MKClRyYW5zZm9ybSB0aGUgc2FtcGxlcyBiYWNrIGZyb20gdGhlIGxvZyBkb21haW4gdG8gdGhlIGxpbmVhciBkb21haW4KCmBgYHtyfQp0aW1lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMjIGFkanVzdCB0byB6b29tIGluIGFuZCBvdXQKdGltZSA8LWFzLkRhdGUodGltZSkKb3V0IDwtIGFzLm1hdHJpeChZRjQ1X291dF9yZXNwb25zZSkgICAgICAgICAjIyBjb252ZXJ0IGZyb20gY29kYSB0byBtYXRyaXgKYGBgCgpjb2RlIGZyb20gQU1XIGZvciBzcGxpdHRpbmcgdXAgdGhpcyBtYXRyaXgKYGBge3J9CnhfY29scyA8LSBncmVwKCdeeCcsIGNvbG5hbWVzKG91dCkpCm9ic19jb2xzIDwtIGdyZXAoJ15PQlMnLCBjb2xuYW1lcyhvdXQpKQoKb3V0X3ggPC0gb3V0Wyx4X2NvbHNdCm91dF9vYnMgPC0gb3V0WyxvYnNfY29sc10KCnJtKG91dCkKCm91dF94IDwtIHQob3V0X3gpCgpvdXRfeCA8LSBhcy5kYXRhLmZyYW1lKG91dF94KQpvdXRfeDIgPC0gb3V0X3ggfD4KICB0aWJibGU6OnJvd25hbWVzX3RvX2NvbHVtbih2YXIgPSAndGltZV9wb25kJykgfD4KICBkcGx5cjo6bXV0YXRlKHRpbWVzdGVwID0gc3ViKHggPSB0aW1lX3BvbmQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXR0ZXJuID0gJy4qeFxcWycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXBsYWNlbWVudCA9ICcnKSwKICAgICAgICAgICAgICAgIHRpbWVzdGVwID0gc3ViKHggPSB0aW1lc3RlcCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdHRlcm4gPSAnLC4qJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcGxhY2VtZW50ID0gJycpLAogICAgICAgICAgICAgICAgcG9uZCA9IHN1Yih4ID0gdGltZV9wb25kLAogICAgICAgICAgICAgICAgICAgICAgICAgICBwYXR0ZXJuID0gJy4qLCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcGxhY2VtZW50ID0gJycpLAogICAgICAgICAgICAgICAgcG9uZCA9IHN1Yih4ID0gcG9uZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0dGVybiA9ICdcXF0nLAogICAgICAgICAgICAgICAgICAgICAgICAgICByZXBsYWNlbWVudCA9ICcnKSkgfD4KICB0aWR5cjo6cGl2b3RfbG9uZ2VyKC1jKHRpbWVfcG9uZCwgdGltZXN0ZXAsIHBvbmQpLAogICAgICAgICAgICAgICAgICAgICAgbmFtZXNfdG8gPSAnaXRlcicsIHZhbHVlc190byA9ICd2YWwnKSB8PgogIGRwbHlyOjpncm91cF9ieShwb25kLCB0aW1lc3RlcCkgfD4KICBkcGx5cjo6c3VtbWFyaXplKGxvdyA9IHF1YW50aWxlKHZhbCwgcHJvYnMgPSAwLjAyNSksCiAgICAgICAgICAgICAgICAgICBtZWQgPSBtZWRpYW4odmFsKSwKICAgICAgICAgICAgICAgICAgIGhpZ2ggPSBxdWFudGlsZSh2YWwsIHByb2JzID0gMC45NzUpKQoKdGltZXN0ZXBzIDwtIGFzLmRhdGEuZnJhbWUodGltZSkKdGltZXN0ZXBzJGluZCA8LSBhcy5jaGFyYWN0ZXIoc2VxKGZyb20gPSAxLCB0byA9IG5yb3codGltZXN0ZXBzKSwgYnkgPSAxKSkKY29sbmFtZXModGltZXN0ZXBzKSA8LSBjKCd0aW1lJywgJ3RpbWVzdGVwJykKCnBvbmRzIDwtIGFzLmRhdGEuZnJhbWUoY29sbmFtZXMoWUZfV2F0ZXJUZW1wNDVbLTFdKSkKcG9uZHMkaW5kIDwtIGFzLmNoYXJhY3RlcihzZXEoZnJvbSA9IDEsIHRvID0gbnJvdyhwb25kcyksIGJ5ID0gMSkpCmNvbG5hbWVzKHBvbmRzKSA8LSBjKCdwb25kX25hbWUnLCAncG9uZCcpCgpvdXRfeF9tYXBwZWQgPC0gb3V0X3gyIHw+CiAgZHBseXI6OmxlZnRfam9pbih5ID0gdGltZXN0ZXBzLCBieSA9ICd0aW1lc3RlcCcpIHw+CiAgZHBseXI6OmxlZnRfam9pbih5ID0gcG9uZHMsIGJ5ID0gJ3BvbmQnKSB8PgogIGRwbHlyOjpzZWxlY3QobG93LCBtZWQsIGhpZ2gsIHRpbWUsIHBvbmRfbmFtZSkKCnBYIDwtIG91dF94X21hcHBlZCB8PgogIGdncGxvdDI6OmdncGxvdCgpICsKICBnZ3Bsb3QyOjpnZW9tX2xpbmUoZ2dwbG90Mjo6YWVzKHggPSB0aW1lLCB5ID0gbWVkKSkgKwogIGdncGxvdDI6Omdlb21fcmliYm9uKGdncGxvdDI6OmFlcyh4ID0gdGltZSwgeW1pbiA9IGxvdywgeW1heCA9IGhpZ2gpKSArCiAgZ2dwbG90Mjo6ZmFjZXRfd3JhcCh+cG9uZF9uYW1lKQoKb3V0X29icyA8LSB0KG91dF9vYnMpCgpvdXRfb2JzIDwtIGFzLmRhdGEuZnJhbWUob3V0X29icykKCm91dF9vYnMyIDwtIG91dF9vYnMgfD4KICB0aWJibGU6OnJvd25hbWVzX3RvX2NvbHVtbih2YXIgPSAndGltZV9wb25kJykgfD4KICBkcGx5cjo6bXV0YXRlKHRpbWVzdGVwID0gc3ViKHggPSB0aW1lX3BvbmQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXR0ZXJuID0gJy4qT0JTXFxbJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcGxhY2VtZW50ID0gJycpLAogICAgICAgICAgICAgICAgdGltZXN0ZXAgPSBzdWIoeCA9IHRpbWVzdGVwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0dGVybiA9ICcsLionLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwbGFjZW1lbnQgPSAnJyksCiAgICAgICAgICAgICAgICBwb25kID0gc3ViKHggPSB0aW1lX3BvbmQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdHRlcm4gPSAnLiosJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwbGFjZW1lbnQgPSAnJyksCiAgICAgICAgICAgICAgICBwb25kID0gc3ViKHggPSBwb25kLAogICAgICAgICAgICAgICAgICAgICAgICAgICBwYXR0ZXJuID0gJ1xcXScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcGxhY2VtZW50ID0gJycpKSB8PgogIHRpZHlyOjpwaXZvdF9sb25nZXIoLWModGltZV9wb25kLCB0aW1lc3RlcCwgcG9uZCksCiAgICAgICAgICAgICAgICAgICAgICBuYW1lc190byA9ICdpdGVyJywgdmFsdWVzX3RvID0gJ3ZhbCcpIHw+CiAgZHBseXI6Omdyb3VwX2J5KHBvbmQsIHRpbWVzdGVwKSB8PgogIGRwbHlyOjpzdW1tYXJpemUobG93ID0gcXVhbnRpbGUodmFsLCBwcm9icyA9IDAuMDI1KSwKICAgICAgICAgICAgICAgICAgIG1lZCA9IG1lZGlhbih2YWwpLAogICAgICAgICAgICAgICAgICAgaGlnaCA9IHF1YW50aWxlKHZhbCwgcHJvYnMgPSAwLjk3NSkpCgpvdXRfb2JzX21hcHBlZCA8LSBvdXRfb2JzMiB8PgogIGRwbHlyOjpsZWZ0X2pvaW4oeSA9IHRpbWVzdGVwcywgYnkgPSAndGltZXN0ZXAnKSB8PgogIGRwbHlyOjpsZWZ0X2pvaW4oeSA9IHBvbmRzLCBieSA9ICdwb25kJykgfD4KICBkcGx5cjo6c2VsZWN0KGxvdywgbWVkLCBoaWdoLCB0aW1lLCBwb25kX25hbWUpCgpwT0JTIDwtIG91dF9vYnNfbWFwcGVkIHw+CiAgZ2dwbG90Mjo6Z2dwbG90KCkgKwogIGdncGxvdDI6Omdlb21fbGluZShnZ3Bsb3QyOjphZXMoeCA9IHRpbWUsIHkgPSBtZWQpKSArCiAgZ2dwbG90Mjo6Z2VvbV9yaWJib24oZ2dwbG90Mjo6YWVzKHggPSB0aW1lLCB5bWluID0gbG93LCB5bWF4ID0gaGlnaCkpICsKICBnZ3Bsb3QyOjpmYWNldF93cmFwKH5wb25kX25hbWUpCgpjb3dwbG90OjpwbG90X2dyaWQocFgsIHBPQlMpCmBgYAoKIyMjIFByb2JhYmlsaXR5IG9mIENyb3NzaW5nIFRocmVzaG9sZAoKYGBge3J9CnRocmVzaG9sZF9wcm9icyA8LSBvdXRfb2JzIHw+CiAgdGliYmxlOjpyb3duYW1lc190b19jb2x1bW4odmFyID0gJ3RpbWVfcG9uZCcpIHw+CiAgZHBseXI6Om11dGF0ZSh0aW1lc3RlcCA9IHN1Yih4ID0gdGltZV9wb25kLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0dGVybiA9ICcuKk9CU1xcWycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXBsYWNlbWVudCA9ICcnKSwKICAgICAgICAgICAgICAgIHRpbWVzdGVwID0gc3ViKHggPSB0aW1lc3RlcCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdHRlcm4gPSAnLC4qJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcGxhY2VtZW50ID0gJycpLAogICAgICAgICAgICAgICAgcG9uZCA9IHN1Yih4ID0gdGltZV9wb25kLAogICAgICAgICAgICAgICAgICAgICAgICAgICBwYXR0ZXJuID0gJy4qLCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcGxhY2VtZW50ID0gJycpLAogICAgICAgICAgICAgICAgcG9uZCA9IHN1Yih4ID0gcG9uZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0dGVybiA9ICdcXF0nLAogICAgICAgICAgICAgICAgICAgICAgICAgICByZXBsYWNlbWVudCA9ICcnKSkgfD4KICB0aWR5cjo6cGl2b3RfbG9uZ2VyKC1jKHRpbWVfcG9uZCwgdGltZXN0ZXAsIHBvbmQpLAogICAgICAgICAgICAgICAgICAgICAgbmFtZXNfdG8gPSAnaXRlcicsIHZhbHVlc190byA9ICd2YWwnKSB8PgogIGRwbHlyOjpncm91cF9ieShwb25kLCB0aW1lc3RlcCkgfD4KICBkcGx5cjo6c3VtbWFyaXplKG5faXRlciA9IGRwbHlyOjpuKCksCiAgICAgICAgICAgICAgICAgICBuX3RocmVzaCA9IHN1bSh2YWwgPiAyMCksCiAgICAgICAgICAgICAgICAgICBwcm9iID0gKG5fdGhyZXNoIC8gbl9pdGVyKSAqIDEwMCkKCnRocmVzaG9sZF9wcm9ic19tYXBwZWQgPC0gdGhyZXNob2xkX3Byb2JzIHw+CiAgZHBseXI6OmxlZnRfam9pbih5ID0gdGltZXN0ZXBzLCBieSA9ICd0aW1lc3RlcCcpIHw+CiAgZHBseXI6OmxlZnRfam9pbih5ID0gcG9uZHMsIGJ5ID0gJ3BvbmQnKQoKdGhyZXNob2xkX3Byb2JzX21hcHBlZCB8PgogIGdncGxvdDI6OmdncGxvdCgpICsKICBnZ3Bsb3QyOjpnZW9tX2xpbmUoZ2dwbG90Mjo6YWVzKHggPSB0aW1lLCB5ID0gcHJvYikpICsKICBnZ3Bsb3QyOjpmYWNldF93cmFwKH5wb25kX25hbWUpCmBgYAoKU2F2ZSB0aGVzZSBvdXB1dHMgdXNpbmcgYSAuUkRhdGFGaWxlIHR5cGUKCmBgYHtyfQpzYXZlLmltYWdlKGZpbGUgPSAiQ29ycl9Qb29sZWRNb2RfWUY0NS5SRGF0YSIpCgojQ3VycmVudGx5IHRoaXMgaGFzIGFsbCB0aGUgaW5mb3JtYXRpb24gaW4gaXQuIEV2ZW50dWFsbHkgY291bGQgbGltaXQgdGhpcyB0byBiZSBqdXN0IHRoZSByZWxhdmVudCBpbmZvcm1hdGlvbiBmb3IgdGhlIHJlbWFpbmluZyBjb2RlIGJlbG93CmBgYAoKIyMjIE1ha2luZyBHcmFwaHMKCkxvYWQgaW4gdGhpcyBmaWxlIGhlcmUgYXMgbG9uZyBhcyBubyBjb2RlIGNoYW5nZXMgYXJlIG5lZWRlZCBhYm92ZQoKYGBge3J9CmxvYWQoZmlsZSA9ICJDb3JyX1Bvb2xlZE1vZF9ZRjQ1LlJEYXRhIikKYGBgCgpDcmVhdGluZyBzb21lIG5pY2UgcGxvdHMgb2YgdGhlc2UKCjEuIGNvbG9yZWQgcGFuZWwgcGxvdCAoZWFjaCBwb25kcyBmb3JlY2FzdCB3aXRoIHRoZSBtZWRpYW4sIGhpZ2gsIGFuZCBsb3cgcGx1cyBhIHRyZW5kIGxpbmUpCmBgYHtyfQojIHNldCB1cCB0aGUgY29sb3JzIGhlcmUgZm9yIHRoZSBwbG90cyBiZWxvdyBzbyB0aGF0IGVhY2ggcG9uZCBoYXMgdGhlIHNhbWUgY29sb3IgZWFjaCB0aW1lCk1vZF9ZRjQ1IDwtIG91dF9vYnNfbWFwcGVkCnN0cihNb2RfWUY0NSkKd3JpdGUuY3N2KE1vZF9ZRjQ1LCAiTW9kX1lGNDUuY3N2IikKCiMgRGVmaW5lIHRoZSBjdXN0b20gY29sb3IgcGFsZXR0ZQpZRl9jb2xvcnMgPC0gYygiI0U0MUExQyIsICIjMzc3RUI4IiwgIiM0REFGNEEiLCAiIzk4NEVBMyIsICIjRkY3RjAwIiwgIiNGRkZGMzMiLCAiI0E2NTYyOCIsICIjRjc4MUJGIiwgImxpZ2h0Ymx1ZSIsICJsaWdodGdyZWVuIiwgIiM2QTNEOUEiKQoKIyBFbnN1cmUgdGhhdCBZRl9jb2xvcnMgaGFzIHRoZSBzYW1lIGxlbmd0aCBhcyB0aGUgbnVtYmVyIG9mIHVuaXF1ZSBwb25kcwp1bmlxdWVfcG9uZHMgPC0gdW5pcXVlKE1vZF9ZRjQ1JHBvbmRfbmFtZSkKaWYgKGxlbmd0aChZRl9jb2xvcnMpICE9IGxlbmd0aCh1bmlxdWVfcG9uZHMpKSB7CiAgc3RvcCgiVGhlIG51bWJlciBvZiBjb2xvcnMgaW4gWUZfY29sb3JzIGRvZXMgbm90IG1hdGNoIHRoZSBudW1iZXIgb2YgdW5pcXVlIHBvbmRzLiIpCn0KCiMgQ3JlYXRlIGEgbmFtZWQgdmVjdG9yIGZvciBZRl9jb2xvcnMgd2l0aCBwb25kIG5hbWVzCmNvbG9yX21hcHBpbmcgPC0gc2V0TmFtZXMoWUZfY29sb3JzLCB1bmlxdWVfcG9uZHMpCgojIFBsb3R0aW5nClBvbmRzX1lGNDUgPC0gZ2dwbG90KGRhdGEgPSBNb2RfWUY0NSwgYWVzKHggPSB0aW1lKSkgKwogIGdlb21fcmliYm9uKGFlcyh5bWluID0gbG93LCB5bWF4ID0gaGlnaCwgZmlsbCA9IHBvbmRfbmFtZSkpICsgICMgQWRkIHRoZSByaWJib24gd2l0aCBjb2xvcnMKICBnZW9tX2xpbmUoYWVzKHkgPSBtZWQsIGNvbG9yID0gcG9uZF9uYW1lKSkgKyAgIyBFbnN1cmUgbGluZXMgYXJlIHZpc2libGUgYW5kIGNvbG9yZWQgYnkgcG9uZAogIGdlb21fc21vb3RoKGFlcyh5ID0gbWVkLCBjb2xvciA9ICJncmV5IiksIHNpemUgPSAxKSArICAjIEVuc3VyZSBsaW5lcyBhcmUgdmlzaWJsZSBhbmQgY29sb3JlZCBieSBwb25kCiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gYXMuRGF0ZSgiMjAyMC0xMi0wMSIpLCBsaW5ldHlwZSA9ICJkYXNoZWQiLCBjb2xvciA9ICJyZWQiKSArICAjIEFkZCB2ZXJ0aWNhbCBkYXNoZWQgcmVkIGxpbmUKICBmYWNldF93cmFwKH4gcG9uZF9uYW1lKSArICAjIEZhY2V0IGJ5IHBvbmRfbmFtZQogIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXMgPSBjb2xvcl9tYXBwaW5nKSArICAjIFVzZSBjdXN0b20gY29sb3JzIGZvciBsaW5lcwogIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcyA9IGNvbG9yX21hcHBpbmcpICsgICAjIFVzZSBjdXN0b20gY29sb3JzIGZvciByaWJib25zCiAgeGxhYigiWWVhciIpICsKICB5bGFiKCJXYXRlciBUZW1wZXJhdHVyZSAowrBDKSIpICsKICB0aGVtZV9jbGFzc2ljKCkgKwogIHRoZW1lKHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoaGp1c3QgPSAwLjUsIHNpemUgPSAyNCksCiAgICAgICAgYXhpcy50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gMjIpLAogICAgICAgIGF4aXMudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gMjApLAogICAgICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gNDUsIGhqdXN0ID0gMSksCiAgICAgICAgbGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiLAogICAgICAgIHN0cmlwLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE2KSkKUG9uZHNfWUY0NQoKZ2dzYXZlKCJDb3JyX0luZFBvbmRzX1lGNDUucG5nIiwgcGxvdCA9IFBvbmRzX1lGNDUsIHdpZHRoID0gOCwgaGVpZ2h0ID0gNikKYGBgCgoyLiBUcmVuZCBieSBwb25kIChnZW9tIHNtb290aCBmb3IgZWFjaCBwb25kIG9uIHRoZSBzYW1lIHBsb3QgZm9yIGNvbXBhcmlzb24pCgpgYGB7cn0KIyB1c2luZyB0aGUgc2FtZSBhZXN0ZXRpY3MgYXMgYWJvdmUKClRyZW5kc19ZRjQ1IDwtIGdncGxvdChkYXRhID0gTW9kX1lGNDUsIGFlcyh4ID0gdGltZSkpICsKICBnZW9tX3Ntb290aChhZXMoeSA9IG1lZCwgY29sb3IgPSBwb25kX25hbWUsIGZpbGwgPSBwb25kX25hbWUpLCBhbHBoYSA9IDAuMTUsIHNpemUgPSAxKSArICAjIFNtb290aCBsaW5lcyB3aXRoIGNvbG9ycyBieSBwb25kX25hbWUKICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzID0gY29sb3JfbWFwcGluZykgKwogIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcyA9IGNvbG9yX21hcHBpbmcpICsgICAjIFVzZSBjdXN0b20gY29sb3JzIGZvciByaWJib25zCiAgbGFicygKICAgICAgIHggPSAiWWVhciIsCiAgICAgICB5ID0gIldhdGVyIFRlbXBlcmF0dXJlICjCsEMpIiwKICAgICAgIGNvbG9yID0gIlBvbmQgTmFtZSIsCiAgICAgICBmaWxsID0gIlBvbmQgTmFtZSIpICsgICMgTGFiZWxzIGZvciBsZWdlbmQKICB0aGVtZV9jbGFzc2ljKCkgKwogIHRoZW1lKHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoaGp1c3QgPSAwLjUsIHNpemUgPSAxOCksCiAgICAgICAgYXhpcy50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gMjIpLAogICAgICAgIGF4aXMudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gMjApLAogICAgICAgIGxlZ2VuZC5wb3NpdGlvbiA9ICJyaWdodCIsCiAgICAgICAgbGVnZW5kLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE2KSwgIyBDaGFuZ2UgdGhlIGxlZ2VuZCB0ZXh0IHNpemUgaGVyZQogICAgICAgIGxlZ2VuZC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gMjApKQpUcmVuZHNfWUY0NQoKZ2dzYXZlKCJDb3JyX0luZFRyZW5kc19ZRjQ1LnBuZyIsIHBsb3QgPSBUcmVuZHNfWUY0NSwgd2lkdGggPSA5LCBoZWlnaHQgPSA2KQoKYGBgCgozLiBwcm9iYWJpbGl0eSBwbG90IChieSBwb25kKQoKYGBge3J9CnByb2JzX1lGNDUgPC0gdGhyZXNob2xkX3Byb2JzX21hcHBlZAp3cml0ZS5jc3YocHJvYnNfWUY0NSwgInByb2JzX1lGNDUuY3N2IikKClByb2JzMjBfWUY0NSA8LSBnZ3Bsb3QoZGF0YSA9IHByb2JzX1lGNDUsIGFlcyh4ID0gdGltZSkpICsKICBnZW9tX2xpbmUoYWVzKHkgPSBwcm9iLCBjb2xvciA9IHBvbmRfbmFtZSkpICsgICMgRW5zdXJlIGxpbmVzIGFyZSB2aXNpYmxlIGFuZCBjb2xvcmVkIGJ5IHBvbmQKICBmYWNldF93cmFwKH4gcG9uZF9uYW1lKSArICAjIEZhY2V0IGJ5IHBvbmRfbmFtZQogIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXMgPSBjb2xvcl9tYXBwaW5nKSArICAjIFVzZSBjdXN0b20gY29sb3JzIGZvciBsaW5lcwogIHhsYWIoIlllYXIiKSArCiAgeWxhYigiUHJvYmFiaWxpdHkiKSArCiAgeGxpbShhcy5EYXRlKGMoIjIwMjAtMTItMDEiLCAiMjA5OS0xMi0wMSIpKSkgKwogIHlsaW0oMCw1MCkgKwogIHRoZW1lX2NsYXNzaWMoKSArCiAgdGhlbWUocGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDAuNSwgc2l6ZSA9IDI0KSwKICAgICAgICBheGlzLnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSAyMiksCiAgICAgICAgYXhpcy50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAyMCksCiAgICAgICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA0NSwgaGp1c3QgPSAxKSwKICAgICAgICBsZWdlbmQucG9zaXRpb24gPSAibm9uZSIsCiAgICAgICAgc3RyaXAudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTYpKQpQcm9iczIwX1lGNDUKCmdnc2F2ZSgiQ29ycl9Qcm9iczIwX1lGNDUucG5nIiwgcGxvdCA9IFByb2JzMjBfWUY0NSwgd2lkdGggPSAxMCwgaGVpZ2h0ID0gNikKYGBgCgo0LiBNb2RlbCBmaXRzIGJ5IHBvbmQKCmBgYHtyfQpNb2RfWUY0NQoKTW9kT2JzIDwtIE1vZF9ZRjQ1ICU+JQogIGZpbHRlcih0aW1lIDwgIjIwMjEtMDEtMDEiKQpyYW5nZShNb2RPYnMkdGltZSkKCkVycm9yUGxvdF9ZRjQ1IDwtIGdncGxvdChkYXRhID0gTW9kT2JzLCBhZXMoeCA9IHRpbWUpKSArCiAgZ2VvbV9yaWJib24oYWVzKHltaW4gPSBsb3csIHltYXggPSBoaWdoLCBmaWxsID0gcG9uZF9uYW1lKSkgKyAgIyBBZGp1c3QgZmlsbCBjb2xvcnMKICBnZW9tX2xpbmUoYWVzKHkgPSBtZWQpLCBjb2xvciA9ICJibGFjayIpICsgICMgQmxhY2sgbGluZXMgZm9yIHRoZSBtZWRpYW4gdmFsdWVzCiAgZmFjZXRfd3JhcCh+IHBvbmRfbmFtZSkgKyAgIyBGYWNldCBieSBwb25kX25hbWUKICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXMgPSBjb2xvcl9tYXBwaW5nKSArICAjIEFwcGx5IGN1c3RvbSBjb2xvciBwYWxldHRlIGZvciByaWJib25zCiAgbGFicygKICAgICAgIHggPSAiWWVhciIsCiAgICAgICB5ID0gIldhdGVyIFRlbXBlcmF0dXJlICjCsEMpIiwKICAgICAgIGNvbG9yID0gIlBvbmQgTmFtZSIsCiAgICAgICBmaWxsID0gIlBvbmQgTmFtZSIpICsgICMgTGFiZWxzIGZvciBsZWdlbmQKICB0aGVtZV9jbGFzc2ljKCkgKwogIHRoZW1lKAogICAgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDAuNSksCiAgICBheGlzLnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSAyMiksCiAgICBheGlzLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDIwKSwKICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gNDUsIGhqdXN0ID0gMSksCiAgICBsZWdlbmQucG9zaXRpb24gPSAibm9uZSIgIyBBbmdsZSB4LWF4aXMgbGFiZWxzIGlmIG5lZWRlZAogICkKRXJyb3JQbG90X1lGNDUKCmdnc2F2ZSgiQ29ycl9FcnJvcl9ZRjQ1LnBuZyIsIHBsb3QgPSBFcnJvclBsb3RfWUY0NSwgd2lkdGggPSA5LCBoZWlnaHQgPSA2KQpgYGAKCkNsZWFyIG91dCB0aGUgZW52aXJvbm1lbnQgYW5kIHJlbG9hZCB0aGUgYmFzaWNzIGJlZm9yZSBzdGFydGluZyB0aGUgbmV4dCBzZWN0aW9uCgpgYGB7cn0Kcm0obGlzdCA9IGxzKCkpCgpsaWJyYXJ5KHRpZHl2ZXJzZSkKbGlicmFyeShyamFncykKbGlicmFyeShnZ3Bsb3QyKQoKc2V0LnNlZWQoMSkKYGBgCgojIyBSQ1AgOC41CgojIyMgRGVzaWduIHRoZSBNb2RlbAoKUmVhZCBpbiB0aGUgZGF0YSBoZXJlLCB3aGljaCBpcyBhbiBvdXRwdXQgb2YgWFggY29kZSBmaWxlCgpUaGVuIHNlcGFyYXRlIHRoZSBkYXRhIGludG8gYWlyIGFuZCB3YXRlciB0ZW1wZXJhdHVyZSBmaWxlcwoKYGBge3J9CiMgQWlyIGFuZCB3YXRlciB0ZW1wZXJhdHVyZSBkYXRhOiBZRiBsb2NjYXRpb24sIDQuNSBzY2VuYXJpbwpZRl9UZW1wcyA8LSByZWFkLmNzdigiWUZfODVTTkFQRm9yZWNhc3QuY3N2IiwgaGVhZGVyPVRSVUUpCgojIEFpciB0ZW1wZXJhdHVyZSB2YXJpYWJsZXMKWUZfQWlyVGVtcDg1IDwtIFlGX1RlbXBzICU+JQogIHNlbGVjdChkYXRlLCBBaXJwb3J0LCBBaXJfTW9udGhBdmcsIHN0ZCwgcHJlY2lzaW9uLCBSZWdpb24pCgojIFdhdGVyIHRlbXBlcmF0dXJlIHZhcmlhYmxlcwpZRl9XYXRlclRlbXA4NSA8LSBZRl9UZW1wcyAlPiUKICBzZWxlY3QoZGF0ZSwgTVAxLCBNUDMsIE1QNSwgTVA4LCBQTDEsIFBMMiwgUEwzLCBVQlAxLCBVQlAyLCBVQlAzLCBVQlA0KQoKCiMgU2V0IHVwIGEgc3RyaW5nIG9mIGFsbCB0aGUgZGF0ZXMKdGltZSA8LSBZRl9XYXRlclRlbXA4NSRkYXRlCmxlbmd0aCh0aW1lKQpgYGAKClNldHRpbmcgdXAgdGhlIHJhbmRvbSB3YWxrIG1vZGVsCgpgYGB7cn0KZGxtX3Bvb2xlZCA8LSAiCm1vZGVsewojIyMjIFByaW9ycwpmb3IocCBpbiAxOm5wKXsKeFsxLHBdIH4gZG5vcm0oeF9pYywgdGF1X2ljKSAjIEluaXRpYWwgY29uZGl0aW9uIG9mIHdhdGVyIHRlbXBlcmF0dXJlCn0KdGF1X29icyB+IGRnYW1tYShhX29icywgcl9vYnMpICMgUHJpb3Igb24gb2JzZXJ2YXRpb24gZXJyb3IKdGF1X2FkZCB+IGRnYW1tYShhX2FkZCwgcl9hZGQpICMgUHJpb3Igb24gcHJvY2VzcyBlcnJvcgoKIyMjIyBGaXhlZCBFZmZlY3RzCmJldGEgfiBkbW5vcm0obXVfYmV0YSwgdGF1X2JldGEpICMgUHJpb3Igb24gYmV0YSBjb2VmZmljaWVudHMKCmZvcihwIGluIDE6bnApewppbnRbcF0gfiBkbm9ybShtdV9pbnQsIHRhdV9pbnQpICMgUHJpb3Igb24gcG9uZC1zcGVjaWZpYyBpbnRlcmNlcHRzCn0KCiMjIyMgRGF0YSBNb2RlbApmb3IodCBpbiAxOm4peyAjIGxvb3Agb3ZlciBhbGwgdGltZSBzdGVwcwpmb3IocCBpbiAxOm5wKXsKT0JTW3QscF0gfiBkbm9ybSh4W3QscF0sIHRhdV9vYnMpICMgT2JzZXJ2ZWQgd2F0ZXIgdGVtcGVyYXR1cmUgaXMgZHJhd24gZnJvbSBsYXRlbnQgYWlyIHRlbXBlcmF0dXJlIHdpdGggb2JzZXJ2YXRpb24gdW5jZXJ0YWludHkKfQpYZlt0XSB+IGRub3JtKG11QWlyVGVtcFt0XSwgdGF1QWlyVGVtcFt0XSkgIyBMYXRlbnQgYWlyIHRlbXBlcmF0dXJlIGlzIGRyYXduIGZyb20gbWVhbiBhbmQgcHJlY2lzaW9uIG9mIGZvcmVjYXNhdGVkIGFpciB0ZW1wZXJhdHVyZQp9CgojIyMjIFByb2Nlc3MgTW9kZWwKZm9yKHQgaW4gMjpuKXsgIyBsb29wIG92ZXIgYWxsIHRpbWUgc3RlcHMgZXhjZXB0IHRlaCBmaXJzdCAod2UgZGVmaW5lZCBpYyBhYm92ZSkKZm9yKHAgaW4gMTpucCl7Cm11W3QscF0gPC0geFt0LTEscF0gKyBpbnRbcF0gKyBiZXRhWzFdICogeFt0LTEscF0gKyBiZXRhWzJdICogWGZbdF0gIyBNZWFuIHdhdGVyIHRlbXBlcmF0dXJlIGlzIGEgZnVuY3Rpb24gb2YgdGhlIHByZXZpb3VzIHRpbWUgc3RlcCBhbmQgY3VycmVudCBhaXIgdGVtcGVyYXR1cmUKeFt0LHBdIH4gZG5vcm0obXVbdCxwXSwgdGF1X2FkZCkgIyBMYXRlbnQgd2F0ZXIgdGVtcGVyYXR1cmUgaXMgZHJhd24gZnJvbSBtZWFuIHdhdGVyIHRlbXBlcmF0dXJlIHdpdGggcHJvY2VzcyB1bmNlcnRhaW50eQp9Cn0KfQoiCmBgYAoKRGVmaW5lIHRoZSBkYXRhIGFuZCBwcmlvcnMgZm9yIHRoZSBtb2RlbAoKYGBge3J9CiMgRW1wdHkgbGlzdApkYXRhIDwtIGxpc3QoKQojIFdhdGVyIHRlbXBlcmF0dXJlIG9ic2VydmF0aW9ucwpkYXRhJE9CUyA8LSBkcGx5cjo6c2VsZWN0KFlGX1dhdGVyVGVtcDg1LCAtZGF0ZSkKIyBOdW1iZXIgb2YgdGltZSBzdGVwcwpkYXRhJG4gPC0gbnJvdyhkYXRhJE9CUykKIyBOdW1iZXIgb2YgcG9uZHMKZGF0YSRucCA8LSBuY29sKGRhdGEkT0JTKQojIEluaXRpYWwgd2F0ZXIgdGVtcGVyYXR1cmUgbWVhbgpkYXRhJHhfaWMgPC0gMC4xCiMgSW5pdGlhbCB3YXRlciB0ZW1wZXJhdHVyZSBwcmVjaXNpb24KZGF0YSR0YXVfaWMgPSAwLjEKIyBQcmlvciBwYXJhbWV0ZXJzIGZvciBvYnNlcnZhdGlvbiBhbmQgcHJvY2VzcyB1bmNlcnRhaW50eQpkYXRhJGFfb2JzID0gMQpkYXRhJHJfb2JzID0gMQpkYXRhJGFfYWRkID0gMQpkYXRhJHJfYWRkID0gMQojIFByaW9yIHBhcmFtZXRlcnMgZm9yIGJldGEgY29lZmZpY2llbnRzCmRhdGEkbXVfYmV0YSA8LSBjKDAsIDApCmRhdGEkdGF1X2JldGEgPC0gZGlhZyh4ID0gYygwLjAwMSwgMC4wMDEpLCBucm93ID0gMiwgbmNvbCA9IDIpCiMgUHJpb3IgcGFyYW1ldGVycyBmb3IgaW50ZXJjZXB0CmRhdGEkbXVfaW50IDwtIDAKZGF0YSR0YXVfaW50IDwtIDAuMDAxCiMgTWVhbiBhaXIgdGVtcGVyYXR1cmUgZXN0aW1hdGUKZGF0YSRtdUFpclRlbXAgPC0gWUZfQWlyVGVtcDg1JEFpcl9Nb250aEF2ZwojIEFpciB0ZW1wZXJhdHVyZSBwcmVjaXNpb24KZGF0YSR0YXVBaXJUZW1wIDwtIFlGX0FpclRlbXA4NSRwcmVjaXNpb24KCmBgYAoKQ3JlYXRlIEpBR1MgbW9kZWwgd2l0aCAzIGNoYWlucwoKYGBge3J9CmptIDwtIGphZ3MubW9kZWwoZmlsZSA9IHRleHRDb25uZWN0aW9uKGRsbV9wb29sZWQpLCBkYXRhID0gZGF0YSwgbi5jaGFpbnMgPSAzKQpgYGAKClBvc3RlcmlvciBzYW1wbGVzIG9mIHBhcmFtZXRlcnMKCmBgYHtyfQpZRjg1X291dF9wYXJhbXMgPC0gY29kYS5zYW1wbGVzKG1vZGVsID0gam0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXJpYWJsZS5uYW1lcyA9IGMoJ2JldGEnLCAnaW50JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndGF1X2FkZCcsICd0YXVfb2JzJyksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuLml0ZXIgPSA1MDAwMCwgdGhpbiA9IDI1KQpgYGAKClBvc3RlcmlvciBzYW1wbGVzIG9mIHJlc3BvbnNlIHZhcmlhYmxlcwoKYGBge3J9CllGODVfb3V0X3Jlc3BvbnNlIDwtIGNvZGEuc2FtcGxlcyhtb2RlbCA9IGptLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXJpYWJsZS5uYW1lcyA9IGMoJ3gnLCAnT0JTJyksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG4uaXRlciA9IDEwMDAwMCwgdGhpbiA9IDI1KQpgYGAKCkEgY291cGxlIHF1aWNrIGNoZWNrcyBoZXJlCgpgYGB7cn0KIyBwbG90KFlGODVfb3V0X3BhcmFtcykKZ2VsbWFuLmRpYWcoWUY4NV9vdXRfcGFyYW1zLCBjb25maWRlbmNlID0gMC45OSkKCmBgYAoKVmlzdWFsaXplIHRoZSBvdXRwdXQgYnkganVzdCBsb29raW5nIGF0IHRoZSAqKjk1JSBDcmVkaWJsZSBpbnRlcnZhbCBvZiB0aGUgdGltZS1zZXJpZXMgb2YgWCdzKiogYW5kIGNvbXBhcmUgdGhhdCB0byB0aGUgb2JzZXJ2ZWQgWSdzCgpUcmFuc2Zvcm0gdGhlIHNhbXBsZXMgYmFjayBmcm9tIHRoZSBsb2cgZG9tYWluIHRvIHRoZSBsaW5lYXIgZG9tYWluCgpgYGB7cn0KdGltZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIyBhZGp1c3QgdG8gem9vbSBpbiBhbmQgb3V0CnRpbWUgPC1hcy5EYXRlKHRpbWUpCm91dCA8LSBhcy5tYXRyaXgoWUY4NV9vdXRfcmVzcG9uc2UpICAgICAgICAgIyMgY29udmVydCBmcm9tIGNvZGEgdG8gbWF0cml4CmBgYAoKY29kZSBmcm9tIEFNVyBmb3Igc3BsaXR0aW5nIHVwIHRoaXMgbWF0cml4CmBgYHtyfQp4X2NvbHMgPC0gZ3JlcCgnXngnLCBjb2xuYW1lcyhvdXQpKQpvYnNfY29scyA8LSBncmVwKCdeT0JTJywgY29sbmFtZXMob3V0KSkKCm91dF94IDwtIG91dFsseF9jb2xzXQpvdXRfb2JzIDwtIG91dFssb2JzX2NvbHNdCgpybShvdXQpCgpvdXRfeCA8LSB0KG91dF94KQoKb3V0X3ggPC0gYXMuZGF0YS5mcmFtZShvdXRfeCkKb3V0X3gyIDwtIG91dF94IHw+CiAgdGliYmxlOjpyb3duYW1lc190b19jb2x1bW4odmFyID0gJ3RpbWVfcG9uZCcpIHw+CiAgZHBseXI6Om11dGF0ZSh0aW1lc3RlcCA9IHN1Yih4ID0gdGltZV9wb25kLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0dGVybiA9ICcuKnhcXFsnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwbGFjZW1lbnQgPSAnJyksCiAgICAgICAgICAgICAgICB0aW1lc3RlcCA9IHN1Yih4ID0gdGltZXN0ZXAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXR0ZXJuID0gJywuKicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXBsYWNlbWVudCA9ICcnKSwKICAgICAgICAgICAgICAgIHBvbmQgPSBzdWIoeCA9IHRpbWVfcG9uZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0dGVybiA9ICcuKiwnLAogICAgICAgICAgICAgICAgICAgICAgICAgICByZXBsYWNlbWVudCA9ICcnKSwKICAgICAgICAgICAgICAgIHBvbmQgPSBzdWIoeCA9IHBvbmQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdHRlcm4gPSAnXFxdJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwbGFjZW1lbnQgPSAnJykpIHw+CiAgdGlkeXI6OnBpdm90X2xvbmdlcigtYyh0aW1lX3BvbmQsIHRpbWVzdGVwLCBwb25kKSwKICAgICAgICAgICAgICAgICAgICAgIG5hbWVzX3RvID0gJ2l0ZXInLCB2YWx1ZXNfdG8gPSAndmFsJykgfD4KICBkcGx5cjo6Z3JvdXBfYnkocG9uZCwgdGltZXN0ZXApIHw+CiAgZHBseXI6OnN1bW1hcml6ZShsb3cgPSBxdWFudGlsZSh2YWwsIHByb2JzID0gMC4wMjUpLAogICAgICAgICAgICAgICAgICAgbWVkID0gbWVkaWFuKHZhbCksCiAgICAgICAgICAgICAgICAgICBoaWdoID0gcXVhbnRpbGUodmFsLCBwcm9icyA9IDAuOTc1KSkKCnRpbWVzdGVwcyA8LSBhcy5kYXRhLmZyYW1lKHRpbWUpCnRpbWVzdGVwcyRpbmQgPC0gYXMuY2hhcmFjdGVyKHNlcShmcm9tID0gMSwgdG8gPSBucm93KHRpbWVzdGVwcyksIGJ5ID0gMSkpCmNvbG5hbWVzKHRpbWVzdGVwcykgPC0gYygndGltZScsICd0aW1lc3RlcCcpCgpwb25kcyA8LSBhcy5kYXRhLmZyYW1lKGNvbG5hbWVzKFlGX1dhdGVyVGVtcDg1Wy0xXSkpCnBvbmRzJGluZCA8LSBhcy5jaGFyYWN0ZXIoc2VxKGZyb20gPSAxLCB0byA9IG5yb3cocG9uZHMpLCBieSA9IDEpKQpjb2xuYW1lcyhwb25kcykgPC0gYygncG9uZF9uYW1lJywgJ3BvbmQnKQoKb3V0X3hfbWFwcGVkIDwtIG91dF94MiB8PgogIGRwbHlyOjpsZWZ0X2pvaW4oeSA9IHRpbWVzdGVwcywgYnkgPSAndGltZXN0ZXAnKSB8PgogIGRwbHlyOjpsZWZ0X2pvaW4oeSA9IHBvbmRzLCBieSA9ICdwb25kJykgfD4KICBkcGx5cjo6c2VsZWN0KGxvdywgbWVkLCBoaWdoLCB0aW1lLCBwb25kX25hbWUpCgpwWCA8LSBvdXRfeF9tYXBwZWQgfD4KICBnZ3Bsb3QyOjpnZ3Bsb3QoKSArCiAgZ2dwbG90Mjo6Z2VvbV9saW5lKGdncGxvdDI6OmFlcyh4ID0gdGltZSwgeSA9IG1lZCkpICsKICBnZ3Bsb3QyOjpnZW9tX3JpYmJvbihnZ3Bsb3QyOjphZXMoeCA9IHRpbWUsIHltaW4gPSBsb3csIHltYXggPSBoaWdoKSkgKwogIGdncGxvdDI6OmZhY2V0X3dyYXAofnBvbmRfbmFtZSkKCm91dF9vYnMgPC0gdChvdXRfb2JzKQoKb3V0X29icyA8LSBhcy5kYXRhLmZyYW1lKG91dF9vYnMpCgpvdXRfb2JzMiA8LSBvdXRfb2JzIHw+CiAgdGliYmxlOjpyb3duYW1lc190b19jb2x1bW4odmFyID0gJ3RpbWVfcG9uZCcpIHw+CiAgZHBseXI6Om11dGF0ZSh0aW1lc3RlcCA9IHN1Yih4ID0gdGltZV9wb25kLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0dGVybiA9ICcuKk9CU1xcWycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXBsYWNlbWVudCA9ICcnKSwKICAgICAgICAgICAgICAgIHRpbWVzdGVwID0gc3ViKHggPSB0aW1lc3RlcCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdHRlcm4gPSAnLC4qJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcGxhY2VtZW50ID0gJycpLAogICAgICAgICAgICAgICAgcG9uZCA9IHN1Yih4ID0gdGltZV9wb25kLAogICAgICAgICAgICAgICAgICAgICAgICAgICBwYXR0ZXJuID0gJy4qLCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcGxhY2VtZW50ID0gJycpLAogICAgICAgICAgICAgICAgcG9uZCA9IHN1Yih4ID0gcG9uZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0dGVybiA9ICdcXF0nLAogICAgICAgICAgICAgICAgICAgICAgICAgICByZXBsYWNlbWVudCA9ICcnKSkgfD4KICB0aWR5cjo6cGl2b3RfbG9uZ2VyKC1jKHRpbWVfcG9uZCwgdGltZXN0ZXAsIHBvbmQpLAogICAgICAgICAgICAgICAgICAgICAgbmFtZXNfdG8gPSAnaXRlcicsIHZhbHVlc190byA9ICd2YWwnKSB8PgogIGRwbHlyOjpncm91cF9ieShwb25kLCB0aW1lc3RlcCkgfD4KICBkcGx5cjo6c3VtbWFyaXplKGxvdyA9IHF1YW50aWxlKHZhbCwgcHJvYnMgPSAwLjAyNSksCiAgICAgICAgICAgICAgICAgICBtZWQgPSBtZWRpYW4odmFsKSwKICAgICAgICAgICAgICAgICAgIGhpZ2ggPSBxdWFudGlsZSh2YWwsIHByb2JzID0gMC45NzUpKQoKb3V0X29ic19tYXBwZWQgPC0gb3V0X29iczIgfD4KICBkcGx5cjo6bGVmdF9qb2luKHkgPSB0aW1lc3RlcHMsIGJ5ID0gJ3RpbWVzdGVwJykgfD4KICBkcGx5cjo6bGVmdF9qb2luKHkgPSBwb25kcywgYnkgPSAncG9uZCcpIHw+CiAgZHBseXI6OnNlbGVjdChsb3csIG1lZCwgaGlnaCwgdGltZSwgcG9uZF9uYW1lKQoKcE9CUyA8LSBvdXRfb2JzX21hcHBlZCB8PgogIGdncGxvdDI6OmdncGxvdCgpICsKICBnZ3Bsb3QyOjpnZW9tX2xpbmUoZ2dwbG90Mjo6YWVzKHggPSB0aW1lLCB5ID0gbWVkKSkgKwogIGdncGxvdDI6Omdlb21fcmliYm9uKGdncGxvdDI6OmFlcyh4ID0gdGltZSwgeW1pbiA9IGxvdywgeW1heCA9IGhpZ2gpKSArCiAgZ2dwbG90Mjo6ZmFjZXRfd3JhcCh+cG9uZF9uYW1lKQoKY293cGxvdDo6cGxvdF9ncmlkKHBYLCBwT0JTKQpgYGAKCiMjIyBQcm9iYWJpbGl0eSBvZiBDcm9zc2luZyBUaHJlc2hvbGQKCmBgYHtyfQp0aHJlc2hvbGRfcHJvYnMgPC0gb3V0X29icyB8PgogIHRpYmJsZTo6cm93bmFtZXNfdG9fY29sdW1uKHZhciA9ICd0aW1lX3BvbmQnKSB8PgogIGRwbHlyOjptdXRhdGUodGltZXN0ZXAgPSBzdWIoeCA9IHRpbWVfcG9uZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdHRlcm4gPSAnLipPQlNcXFsnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwbGFjZW1lbnQgPSAnJyksCiAgICAgICAgICAgICAgICB0aW1lc3RlcCA9IHN1Yih4ID0gdGltZXN0ZXAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXR0ZXJuID0gJywuKicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXBsYWNlbWVudCA9ICcnKSwKICAgICAgICAgICAgICAgIHBvbmQgPSBzdWIoeCA9IHRpbWVfcG9uZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0dGVybiA9ICcuKiwnLAogICAgICAgICAgICAgICAgICAgICAgICAgICByZXBsYWNlbWVudCA9ICcnKSwKICAgICAgICAgICAgICAgIHBvbmQgPSBzdWIoeCA9IHBvbmQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdHRlcm4gPSAnXFxdJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwbGFjZW1lbnQgPSAnJykpIHw+CiAgdGlkeXI6OnBpdm90X2xvbmdlcigtYyh0aW1lX3BvbmQsIHRpbWVzdGVwLCBwb25kKSwKICAgICAgICAgICAgICAgICAgICAgIG5hbWVzX3RvID0gJ2l0ZXInLCB2YWx1ZXNfdG8gPSAndmFsJykgfD4KICBkcGx5cjo6Z3JvdXBfYnkocG9uZCwgdGltZXN0ZXApIHw+CiAgZHBseXI6OnN1bW1hcml6ZShuX2l0ZXIgPSBkcGx5cjo6bigpLAogICAgICAgICAgICAgICAgICAgbl90aHJlc2ggPSBzdW0odmFsID4gMjApLAogICAgICAgICAgICAgICAgICAgcHJvYiA9IChuX3RocmVzaCAvIG5faXRlcikgKiAxMDApCgp0aHJlc2hvbGRfcHJvYnNfbWFwcGVkIDwtIHRocmVzaG9sZF9wcm9icyB8PgogIGRwbHlyOjpsZWZ0X2pvaW4oeSA9IHRpbWVzdGVwcywgYnkgPSAndGltZXN0ZXAnKSB8PgogIGRwbHlyOjpsZWZ0X2pvaW4oeSA9IHBvbmRzLCBieSA9ICdwb25kJykKCnRocmVzaG9sZF9wcm9ic19tYXBwZWQgfD4KICBnZ3Bsb3QyOjpnZ3Bsb3QoKSArCiAgZ2dwbG90Mjo6Z2VvbV9saW5lKGdncGxvdDI6OmFlcyh4ID0gdGltZSwgeSA9IHByb2IpKSArCiAgZ2dwbG90Mjo6ZmFjZXRfd3JhcCh+cG9uZF9uYW1lKQpgYGAKClNhdmUgdGhlc2Ugb3VwdXRzIHVzaW5nIGEgLlJEYXRhRmlsZSB0eXBlCgpgYGB7cn0Kc2F2ZS5pbWFnZShmaWxlID0gIkNvcnJfUG9vbGVkTW9kX1lGODUuUkRhdGEiKQoKI0N1cnJlbnRseSB0aGlzIGhhcyBhbGwgdGhlIGluZm9ybWF0aW9uIGluIGl0LiBFdmVudHVhbGx5IGNvdWxkIGxpbWl0IHRoaXMgdG8gYmUganVzdCB0aGUgcmVsYXZlbnQgaW5mb3JtYXRpb24gZm9yIHRoZSByZW1haW5pbmcgY29kZSBiZWxvdwpgYGAKCiMjIyBNYWtpbmcgR3JhcGhzCgpMb2FkIGluIHRoaXMgZmlsZSBoZXJlIGFzIGxvbmcgYXMgbm8gY29kZSBjaGFuZ2VzIGFyZSBuZWVkZWQgYWJvdmUKCmBgYHtyfQpsb2FkKGZpbGUgPSAiQ29ycl9Qb29sZWRNb2RfWUY4NS5SRGF0YSIpCmBgYAoKQ3JlYXRpbmcgc29tZSBuaWNlIHBsb3RzIG9mIHRoZXNlCgoxLiBjb2xvcmVkIHBhbmVsIHBsb3QgKGVhY2ggcG9uZHMgZm9yZWNhc3Qgd2l0aCB0aGUgbWVkaWFuLCBoaWdoLCBhbmQgbG93IHBsdXMgYSB0cmVuZCBsaW5lKQpgYGB7cn0KIyBzZXQgdXAgdGhlIGNvbG9ycyBoZXJlIGZvciB0aGUgcGxvdHMgYmVsb3cgc28gdGhhdCBlYWNoIHBvbmQgaGFzIHRoZSBzYW1lIGNvbG9yIGVhY2ggdGltZQpNb2RfWUY4NSA8LSBvdXRfb2JzX21hcHBlZApzdHIoTW9kX1lGODUpCndyaXRlLmNzdihNb2RfWUY4NSwgIk1vZF9ZRjg1LmNzdiIpCgojIERlZmluZSB0aGUgY3VzdG9tIGNvbG9yIHBhbGV0dGUKWUZfY29sb3JzIDwtIGMoIiNFNDFBMUMiLCAiIzM3N0VCOCIsICIjNERBRjRBIiwgIiM5ODRFQTMiLCAiI0ZGN0YwMCIsICIjRkZGRjMzIiwgIiNBNjU2MjgiLCAiI0Y3ODFCRiIsICJsaWdodGJsdWUiLCAibGlnaHRncmVlbiIsICIjNkEzRDlBIikKCiMgRW5zdXJlIHRoYXQgWUZfY29sb3JzIGhhcyB0aGUgc2FtZSBsZW5ndGggYXMgdGhlIG51bWJlciBvZiB1bmlxdWUgcG9uZHMKdW5pcXVlX3BvbmRzIDwtIHVuaXF1ZShNb2RfWUY4NSRwb25kX25hbWUpCmlmIChsZW5ndGgoWUZfY29sb3JzKSAhPSBsZW5ndGgodW5pcXVlX3BvbmRzKSkgewogIHN0b3AoIlRoZSBudW1iZXIgb2YgY29sb3JzIGluIFlGX2NvbG9ycyBkb2VzIG5vdCBtYXRjaCB0aGUgbnVtYmVyIG9mIHVuaXF1ZSBwb25kcy4iKQp9CgojIENyZWF0ZSBhIG5hbWVkIHZlY3RvciBmb3IgWUZfY29sb3JzIHdpdGggcG9uZCBuYW1lcwpjb2xvcl9tYXBwaW5nIDwtIHNldE5hbWVzKFlGX2NvbG9ycywgdW5pcXVlX3BvbmRzKQoKIyBQbG90dGluZwpQb25kc19ZRjg1IDwtIGdncGxvdChkYXRhID0gTW9kX1lGODUsIGFlcyh4ID0gdGltZSkpICsKICBnZW9tX3JpYmJvbihhZXMoeW1pbiA9IGxvdywgeW1heCA9IGhpZ2gsIGZpbGwgPSBwb25kX25hbWUpKSArICAjIEFkZCB0aGUgcmliYm9uIHdpdGggY29sb3JzCiAgZ2VvbV9saW5lKGFlcyh5ID0gbWVkLCBjb2xvciA9IHBvbmRfbmFtZSkpICsgICMgRW5zdXJlIGxpbmVzIGFyZSB2aXNpYmxlIGFuZCBjb2xvcmVkIGJ5IHBvbmQKICBnZW9tX3Ntb290aChhZXMoeSA9IG1lZCwgY29sb3IgPSAiZ3JleSIpLCBzaXplID0gMSkgKyAgIyBFbnN1cmUgbGluZXMgYXJlIHZpc2libGUgYW5kIGNvbG9yZWQgYnkgcG9uZAogIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IGFzLkRhdGUoIjIwMjAtMTItMDEiKSwgbGluZXR5cGUgPSAiZGFzaGVkIiwgY29sb3IgPSAicmVkIikgKyAgIyBBZGQgdmVydGljYWwgZGFzaGVkIHJlZCBsaW5lCiAgZmFjZXRfd3JhcCh+IHBvbmRfbmFtZSkgKyAgIyBGYWNldCBieSBwb25kX25hbWUKICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzID0gY29sb3JfbWFwcGluZykgKyAgIyBVc2UgY3VzdG9tIGNvbG9ycyBmb3IgbGluZXMKICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXMgPSBjb2xvcl9tYXBwaW5nKSArICAgIyBVc2UgY3VzdG9tIGNvbG9ycyBmb3IgcmliYm9ucwogIHhsYWIoIlllYXIiKSArCiAgeWxhYigiV2F0ZXIgVGVtcGVyYXR1cmUgKMKwQykiKSArCiAgdGhlbWVfY2xhc3NpYygpICsKICB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMC41LCBzaXplID0gMjQpLAogICAgICAgIGF4aXMudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDIyKSwKICAgICAgICBheGlzLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDIwKSwKICAgICAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDQ1LCBoanVzdCA9IDEpLAogICAgICAgIGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIiwKICAgICAgICBzdHJpcC50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNikpClBvbmRzX1lGODUKCmdnc2F2ZSgiQ29ycl9JbmRQb25kc19ZRjg1LnBuZyIsIHBsb3QgPSBQb25kc19ZRjg1LCB3aWR0aCA9IDgsIGhlaWdodCA9IDYpCgpgYGAKCkNyZWF0ZSBwbG90cyBvZiB0aGUgdHJlbmQgYnkgcG9uZCAoZ2VvbSBzbW9vdGggZm9yIGVhY2ggcG9uZCBvbiB0aGUgc2FtZSBwbG90IGZvciBjb21wYXJpc29uKQoKYGBge3J9CiMgdXNpbmcgdGhlIHNhbWUgYWVzdGV0aWNzIGFzIGFib3ZlCgpUcmVuZHNfWUY4NSA8LSBnZ3Bsb3QoZGF0YSA9IE1vZF9ZRjg1LCBhZXMoeCA9IHRpbWUpKSArCiAgZ2VvbV9zbW9vdGgoYWVzKHkgPSBtZWQsIGNvbG9yID0gcG9uZF9uYW1lLCBmaWxsID0gcG9uZF9uYW1lKSwgYWxwaGEgPSAwLjE1LCBzaXplID0gMSkgKyAgIyBTbW9vdGggbGluZXMgd2l0aCBjb2xvcnMgYnkgcG9uZF9uYW1lCiAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcyA9IGNvbG9yX21hcHBpbmcpICsKICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXMgPSBjb2xvcl9tYXBwaW5nKSArICAgIyBVc2UgY3VzdG9tIGNvbG9ycyBmb3IgcmliYm9ucwogIGxhYnMoCiAgICAgICB4ID0gIlllYXIiLAogICAgICAgeSA9ICJXYXRlciBUZW1wZXJhdHVyZSAowrBDKSIsCiAgICAgICBjb2xvciA9ICJQb25kIE5hbWUiLAogICAgICAgZmlsbCA9ICJQb25kIE5hbWUiKSArICAjIExhYmVscyBmb3IgbGVnZW5kCiAgdGhlbWVfY2xhc3NpYygpICsKICB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMC41LCBzaXplID0gMTgpLAogICAgICAgIGF4aXMudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDIyKSwKICAgICAgICBheGlzLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDIwKSwKICAgICAgICBsZWdlbmQucG9zaXRpb24gPSAicmlnaHQiLAogICAgICAgIGxlZ2VuZC50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNiksICMgQ2hhbmdlIHRoZSBsZWdlbmQgdGV4dCBzaXplIGhlcmUKICAgICAgICBsZWdlbmQudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDIwKSkKVHJlbmRzX1lGODUKCmdnc2F2ZSgiQ29ycl9JbmRUcmVuZHNfWUY4NS5wbmciLCBwbG90ID0gVHJlbmRzX1lGODUsIHdpZHRoID0gOSwgaGVpZ2h0ID0gNikKCmBgYAoKMy4gcHJvYmFiaWxpdHkgcGxvdCAoYnkgcG9uZCkKCmBgYHtyfQpwcm9ic19ZRjg1IDwtIHRocmVzaG9sZF9wcm9ic19tYXBwZWQKd3JpdGUuY3N2KHByb2JzX1lGODUsICJwcm9ic19ZRjg1LmNzdiIpCgpQcm9iczIwX1lGODUgPC0gZ2dwbG90KGRhdGEgPSBwcm9ic19ZRjg1LCBhZXMoeCA9IHRpbWUpKSArCiAgZ2VvbV9saW5lKGFlcyh5ID0gcHJvYiwgY29sb3IgPSBwb25kX25hbWUpKSArICAjIEVuc3VyZSBsaW5lcyBhcmUgdmlzaWJsZSBhbmQgY29sb3JlZCBieSBwb25kCiAgZmFjZXRfd3JhcCh+IHBvbmRfbmFtZSkgKyAgIyBGYWNldCBieSBwb25kX25hbWUKICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzID0gY29sb3JfbWFwcGluZykgKyAgIyBVc2UgY3VzdG9tIGNvbG9ycyBmb3IgbGluZXMKICB4bGFiKCJZZWFyIikgKwogIHlsYWIoIlByb2JhYmlsaXR5IikgKwogIHhsaW0oYXMuRGF0ZShjKCIyMDIwLTEyLTAxIiwgIjIwOTktMTItMDEiKSkpICsKICB5bGltKDAsNTApICsKICB0aGVtZV9jbGFzc2ljKCkgKwogIHRoZW1lKHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoaGp1c3QgPSAwLjUsIHNpemUgPSAyNCksCiAgICAgICAgYXhpcy50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gMjIpLAogICAgICAgIGF4aXMudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gMjApLAogICAgICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gNDUsIGhqdXN0ID0gMSksCiAgICAgICAgbGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiLAogICAgICAgIHN0cmlwLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE2KSkKUHJvYnMyMF9ZRjg1CgpnZ3NhdmUoIkNvcnJfUHJvYnMyMF9ZRjg1LnBuZyIsIHBsb3QgPSBQcm9iczIwX1lGODUsIHdpZHRoID0gOSwgaGVpZ2h0ID0gNikKYGBgCgo0LiBNb2RlbCBmaXRzIGJ5IHBvbmQKCmBgYHtyfQpNb2RfWUY4NQoKTW9kT2JzIDwtIE1vZF9ZRjg1ICU+JQogIGZpbHRlcih0aW1lIDwgIjIwMjEtMDEtMDEiKQpyYW5nZShNb2RPYnMkdGltZSkKCk1vZGVsRXJyb3JQbG90X1lGODUgPC0gZ2dwbG90KGRhdGEgPSBNb2RPYnMsIGFlcyh4ID0gdGltZSkpICsKICBnZW9tX3JpYmJvbihhZXMoeW1pbiA9IGxvdywgeW1heCA9IGhpZ2gsIGZpbGwgPSBwb25kX25hbWUpKSArICAjIEFkanVzdCBmaWxsIGNvbG9ycwogIGdlb21fbGluZShhZXMoeSA9IG1lZCksIGNvbG9yID0gImJsYWNrIikgKyAgIyBCbGFjayBsaW5lcyBmb3IgdGhlIG1lZGlhbiB2YWx1ZXMKICBmYWNldF93cmFwKH4gcG9uZF9uYW1lKSArICAjIEZhY2V0IGJ5IHBvbmRfbmFtZQogIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcyA9IGNvbG9yX21hcHBpbmcpICsgICMgQXBwbHkgY3VzdG9tIGNvbG9yIHBhbGV0dGUgZm9yIHJpYmJvbnMKICBsYWJzKAogICAgICAgeCA9ICJZZWFyIiwKICAgICAgIHkgPSAiV2F0ZXIgVGVtcGVyYXR1cmUgKMKwQykiLAogICAgICAgY29sb3IgPSAiUG9uZCBOYW1lIiwKICAgICAgIGZpbGwgPSAiUG9uZCBOYW1lIikgKyAgIyBMYWJlbHMgZm9yIGxlZ2VuZAogIHRoZW1lX2NsYXNzaWMoKSArCiAgdGhlbWUocGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDAuNSwgc2l6ZSA9IDE4KSwKICAgICAgICBheGlzLnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSAyMiksCiAgICAgICAgYXhpcy50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAyMCksCiAgICAgICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA2NSwgaGp1c3QgPSAxKSwKICAgICAgICBsZWdlbmQucG9zaXRpb24gPSAibm9uZSIsCiAgICAgICAgc3RyaXAudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTYpKQpNb2RlbEVycm9yUGxvdF9ZRjg1CgpnZ3NhdmUoIkNvcnJfRXJyb3JfWUY4NS5wbmciLCBwbG90ID0gTW9kZWxFcnJvclBsb3RfWUY4NSwgd2lkdGggPSA5LCBoZWlnaHQgPSA2KQpgYGAKCkNsZWFyIHRoZSBlbnZpcm9ubWVudAoKYGBge3J9CnJtKGxpc3QgPSBscygpKQpgYGAKCg==